diff --git a/contracts/abis/LDY.json b/contracts/abis/LDY.json new file mode 100644 index 00000000..9952244f --- /dev/null +++ b/contracts/abis/LDY.json @@ -0,0 +1,308 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "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": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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" + } +] \ No newline at end of file diff --git a/contracts/abis/LDYStaking.json b/contracts/abis/LDYStaking.json index a5d24772..ddf461a6 100644 --- a/contracts/abis/LDYStaking.json +++ b/contracts/abis/LDYStaking.json @@ -1,21 +1,71 @@ [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "previousOwner", + "name": "previousAdmin", "type": "address" }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "beacon", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rewardAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardPerSec", + "type": "uint256" + } + ], + "name": "NotifiedRewardAmount", "type": "event" }, { @@ -37,9 +87,185 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], - "name": "acceptOwnership", + "name": "finishAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getEarnedUser", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -48,16 +274,43 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "highTierAccounts", + "name": "getUserStakes", "outputs": [ { - "internalType": "bool", + "components": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "internalType": "struct LDYStaking.StakingInfo[]", "name": "", - "type": "bool" + "type": "tuple[]" } ], "stateMutability": "view", @@ -65,7 +318,7 @@ }, { "inputs": [], - "name": "owner", + "name": "globalBlacklist", "outputs": [ { "internalType": "address", @@ -78,7 +331,7 @@ }, { "inputs": [], - "name": "pendingOwner", + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -91,42 +344,86 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" - }, + } + ], + "name": "highTierAccounts", + "outputs": [ { "internalType": "bool", - "name": "status", + "name": "", "type": "bool" } ], - "name": "setHighTierAccount", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "stakeRewardToken_", "type": "address" + }, + { + "internalType": "uint256[]", + "name": "stakeDurations_", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "stakeDurationForPerks_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeAmountForPerks_", + "type": "uint256" } ], - "name": "tierOf", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", "outputs": [ { "internalType": "uint256", - "name": "tier", + "name": "", "type": "uint256" } ], @@ -134,16 +431,372 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRatePerSec", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "stakeDurationIndex", + "type": "uint8" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeAmountForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeDurationForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakeDurations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeRewardToken", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userStakingInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" } ] \ No newline at end of file diff --git a/contracts/dependencies.json b/contracts/dependencies.json index 987de640..dc6809cf 100644 --- a/contracts/dependencies.json +++ b/contracts/dependencies.json @@ -5,6 +5,10 @@ "59140": "0xf56dc6695cF1f5c364eDEbC7Dc7077ac9B586068", "42161": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "421613": "0xfd064A18f3BF249cf1f87FC203E90D8f650f2d63", - "195":"0x7C3bE0fa5a20ad361685932a50be9dEC6F302db6" + "195": "0x7C3bE0fa5a20ad361685932a50be9dEC6F302db6", + "8453": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "84532": "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + "421614": "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d", + "11155111": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238" } } diff --git a/contracts/deployments.json b/contracts/deployments.json index ba10e3ab..4b461c9a 100644 --- a/contracts/deployments.json +++ b/contracts/deployments.json @@ -5897,6 +5897,19 @@ "stateMutability": "payable", "type": "receive" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -5929,6 +5942,19 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unblacklisted", + "type": "event" + }, { "inputs": [ { @@ -6135,6 +6161,19 @@ "name": "BeaconUpgraded", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -6167,6 +6206,19 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unblacklisted", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -10879,207 +10931,186 @@ } ] }, - "Multicall3": { - "address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82", + "USDC": { + "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", "abi": [ { "inputs": [ { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Call[]", - "name": "calls", - "type": "tuple[]" + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals_", + "type": "uint8" } ], - "name": "aggregate", - "outputs": [ + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "blockNumber", + "name": "value", "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" }, { - "internalType": "bytes[]", - "name": "returnData", - "type": "bytes[]" + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "stateMutability": "payable", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bool", - "name": "allowFailure", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Call3[]", - "name": "calls", - "type": "tuple[]" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "aggregate3", + "name": "allowance", "outputs": [ { - "components": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Result[]", - "name": "returnData", - "type": "tuple[]" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bool", - "name": "allowFailure", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Call3Value[]", - "name": "calls", - "type": "tuple[]" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "aggregate3Value", + "name": "approve", "outputs": [ { - "components": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Result[]", - "name": "returnData", - "type": "tuple[]" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Call[]", - "name": "calls", - "type": "tuple[]" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "blockAndAggregate", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", - "name": "blockNumber", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" }, { - "components": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Result[]", - "name": "returnData", - "type": "tuple[]" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "payable", + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getBasefee", + "name": "decimals", "outputs": [ { - "internalType": "uint256", - "name": "basefee", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", @@ -11087,83 +11118,99 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "blockNumber", + "name": "subtractedValue", "type": "uint256" } ], - "name": "getBlockHash", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getBlockNumber", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "blockNumber", + "name": "addedValue", "type": "uint256" } ], - "stateMutability": "view", + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getChainId", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "chainid", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getCurrentBlockCoinbase", + "name": "name", "outputs": [ { - "internalType": "address", - "name": "coinbase", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "getCurrentBlockDifficulty", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "difficulty", - "type": "uint256" + "internalType": "uint8", + "name": "decimals_", + "type": "uint8" } ], - "stateMutability": "view", + "name": "setDecimals", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getCurrentBlockGasLimit", + "name": "symbol", "outputs": [ { - "internalType": "uint256", - "name": "gaslimit", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], "stateMutability": "view", @@ -11171,11 +11218,11 @@ }, { "inputs": [], - "name": "getCurrentBlockTimestamp", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", - "name": "timestamp", + "name": "", "type": "uint256" } ], @@ -11186,180 +11233,187 @@ "inputs": [ { "internalType": "address", - "name": "addr", + "name": "to", "type": "address" - } - ], - "name": "getEthBalance", - "outputs": [ + }, { "internalType": "uint256", - "name": "balance", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastBlockHash", + "name": "transfer", "outputs": [ { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bool", - "name": "requireSuccess", - "type": "bool" + "internalType": "address", + "name": "from", + "type": "address" }, { - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Call[]", - "name": "calls", - "type": "tuple[]" + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "tryAggregate", + "name": "transferFrom", "outputs": [ { - "components": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "internalType": "struct Multicall3.Result[]", - "name": "returnData", - "type": "tuple[]" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + } + } + }, + { + "name": "hardhat", + "chainId": "31337", + "contracts": {} + } + ], + "42161": [ + { + "name": "arbitrum", + "chainId": "42161", + "contracts": { + "APRHistory": { + "address": "0x3F0Ff9947550d7Cf26549136552C785446ad4Ac5", + "abi": [ { "inputs": [ - { - "internalType": "bool", - "name": "requireSuccess", - "type": "bool" - }, { "components": [ { - "internalType": "address", - "name": "target", - "type": "address" + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" }, { - "internalType": "bytes", - "name": "callData", - "type": "bytes" + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" } ], - "internalType": "struct Multicall3.Call[]", - "name": "calls", - "type": "tuple[]" + "internalType": "struct APRHistory.Reference", + "name": "ref1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref2", + "type": "tuple" } ], - "name": "tryBlockAndAggregate", + "name": "eq", "outputs": [ { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref", + "type": "tuple" + } + ], + "name": "incrementReference", + "outputs": [ { "components": [ { - "internalType": "bool", - "name": "success", - "type": "bool" + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" }, { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" } ], - "internalType": "struct Multicall3.Result[]", - "name": "returnData", - "type": "tuple[]" + "internalType": "struct APRHistory.Reference", + "name": "", + "type": "tuple" } ], - "stateMutability": "payable", + "stateMutability": "pure", "type": "function" } ] }, - "PreMining": { - "address": "0x9A676e781A523b5d0C0e43731313A708CB607508", + "GlobalBlacklist": { + "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", "abi": [ { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "lTokenAddress_", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "maxDistributedLDY_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "lockedHardCap_", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "minLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "maxLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "vestingDuration_", - "type": "uint8" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "AdminChanged", + "type": "event" }, { "anonymous": false, @@ -11367,23 +11421,11 @@ { "indexed": true, "internalType": "address", - "name": "account", + "name": "beacon", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "duration", - "type": "uint8" } ], - "name": "Lock", + "name": "BeaconUpgraded", "type": "event" }, { @@ -11392,17 +11434,32 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "implementation", "type": "address" - }, + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "name": "OwnershipTransferStarted", + "name": "Initialized", "type": "event" }, { @@ -11425,34 +11482,40 @@ "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "Paused", - "type": "event" + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "globalOwner", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [], - "name": "acceptOwnership", + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -11461,55 +11524,29 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "accountsLocks", + "name": "isBlacklisted", "outputs": [ - { - "internalType": "uint240", - "name": "amount", - "type": "uint240" - }, - { - "internalType": "uint8", - "name": "duration", - "type": "uint8" - }, { "internalType": "bool", - "name": "hasUnlocked", + "name": "", "type": "bool" - }, - { - "internalType": "uint216", - "name": "claimedRewards", - "type": "uint216" - }, - { - "internalType": "uint40", - "name": "lockEndTimestamp", - "type": "uint40" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "availableToClaim", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -11517,12 +11554,12 @@ }, { "inputs": [], - "name": "claimPhaseStartTimestamp", + "name": "proxiableUUID", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -11530,187 +11567,224 @@ }, { "inputs": [], - "name": "claimRewards", + "name": "renounceOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "eligibleRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], + "name": "transferOwnership", + "outputs": [], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "endDepositPhase", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "hasClaimPhaseStarted", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "stateMutability": "view", + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "hasDepositPhaseEnded", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { - "inputs": [], - "name": "hasRecoveryPhaseStarted", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" - }, + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalBlacklist_Implementation": { + "address": "0x896E3B079aa7A00413c074a5C888f3b96d4d3bcA", + "abi": [ { "inputs": [], - "name": "instantUnlock", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "lToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract LToken", - "name": "", + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { - "inputs": [], - "name": "ldyToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "beacon", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { + "indexed": false, "internalType": "uint8", - "name": "duration", + "name": "version", "type": "uint8" } ], - "name": "lock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Initialized", + "type": "event" }, { - "inputs": [], - "name": "lockedHardCap", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "maxDistributedLDY", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "view", + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "maxLockDuration", + "name": "globalOwner", "outputs": [ { - "internalType": "uint8", + "internalType": "address", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "maxWeight", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "globalOwner_", + "type": "address" } ], - "stateMutability": "view", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "minLockDuration", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", "outputs": [ { - "internalType": "uint8", + "internalType": "bool", "name": "", - "type": "uint8" + "type": "bool" } ], "stateMutability": "view", @@ -11731,19 +11805,12 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "proxiableUUID", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], "stateMutability": "view", @@ -11751,199 +11818,165 @@ }, { "inputs": [], - "name": "pendingOwner", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "processUnlockRequests", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "tokenAddress", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "recoverERC20", + "name": "unBlacklist", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "requestUnlock", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "ldyTokenAddress", + "name": "newImplementation", "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "setLDYToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startClaimPhase", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startRecoveryPhase", + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" - }, + } + ] + }, + "GlobalBlacklist_Proxy": { + "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "abi": [ { - "inputs": [], - "name": "totalLocked", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "newOwner", + "name": "previousAdmin", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "underlyingToken", - "outputs": [ + }, { - "internalType": "contract IERC20", - "name": "", + "indexed": false, + "internalType": "address", + "name": "newAdmin", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "unlockRequests", - "outputs": [ - { + "indexed": true, "internalType": "address", - "name": "", + "name": "beacon", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "unlockRequestsCursor", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "payable", + "type": "fallback" }, { - "inputs": [], - "name": "vestingDuration", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "receive" } ] }, - "USDC": { - "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "GlobalOwner": { + "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", "abi": [ { + "anonymous": false, "inputs": [ { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "symbol", - "type": "string" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" }, { - "internalType": "uint8", - "name": "decimals_", - "type": "uint8" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "AdminChanged", + "type": "event" }, { "anonymous": false, @@ -11951,23 +11984,45 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "beacon", "type": "address" - }, + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "spender", + "name": "implementation", "type": "address" - }, + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ { "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "name": "Approval", + "name": "Initialized", "type": "event" }, { @@ -11976,70 +12031,95 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", + "name": "OwnershipTransferStarted", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "previousOwner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "newOwner", "type": "address" } ], - "name": "allowance", + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "pendingOwner", + "outputs": [ { "internalType": "address", - "name": "spender", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "approve", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -12047,30 +12127,24 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "name": "burn", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -12079,128 +12153,177 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newImplementation", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "burnFrom", + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalOwner_Implementation": { + "address": "0x36811e4b6d5f890bd0ac858B69499F9a7b2dc05F", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "decreaseAllowance", - "outputs": [ + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "BeaconUpgraded", + "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": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "mint", + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "uint8", - "name": "decimals_", - "type": "uint8" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "setDecimals", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "pendingOwner", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -12208,38 +12331,34 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "proxiableUUID", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "to", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], + "name": "transferOwnership", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -12247,144 +12366,111 @@ "inputs": [ { "internalType": "address", - "name": "from", + "name": "newImplementation", "type": "address" - }, + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "to", + "name": "newImplementation", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "nonpayable", + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", "type": "function" } ] - } - } - }, - { - "name": "hardhat", - "chainId": "31337", - "contracts": {} - } - ], - "42161": [ - { - "name": "arbitrum", - "chainId": "42161", - "contracts": { - "APRHistory": { - "address": "0x3F0Ff9947550d7Cf26549136552C785446ad4Ac5", + }, + "GlobalOwner_Proxy": { + "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", "abi": [ { "inputs": [ { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref1", - "type": "tuple" + "internalType": "address", + "name": "_logic", + "type": "address" }, { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref2", - "type": "tuple" + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "eq", - "outputs": [ + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "pure", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref", - "type": "tuple" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "name": "incrementReference", - "outputs": [ + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "", - "type": "tuple" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "pure", - "type": "function" + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" } ] }, - "GlobalBlacklist": { - "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "GlobalPause": { + "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", "abi": [ { "anonymous": false, @@ -12472,17 +12558,30 @@ "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" }, { "inputs": [], @@ -12511,19 +12610,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isBlacklisted", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -12531,12 +12624,19 @@ }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -12576,14 +12676,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -12637,8 +12731,8 @@ } ] }, - "GlobalBlacklist_Implementation": { - "address": "0x896E3B079aa7A00413c074a5C888f3b96d4d3bcA", + "GlobalPause_Implementation": { + "address": "0xd4568D313FA2d5C6EBA37C9f30F6FB8D1C552ddd", "abi": [ { "inputs": [], @@ -12713,27 +12807,40 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "implementation", + "name": "account", "type": "address" } ], - "name": "Upgraded", + "name": "Paused", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" }, { "inputs": [], @@ -12762,32 +12869,33 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "isBlacklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -12827,14 +12935,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -12872,8 +12974,8 @@ } ] }, - "GlobalBlacklist_Proxy": { - "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "GlobalPause_Proxy": { + "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", "abi": [ { "inputs": [ @@ -12946,8 +13048,160 @@ } ] }, - "GlobalOwner": { - "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", + "LDYStaking": { + "address": "0x4e80beDBD58b084a8946b7BA6814c28906Be2d02", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "highTierAccounts", + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "setHighTierAccount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "LTokenSignaler": { + "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", "abi": [ { "anonymous": false, @@ -13021,17 +13275,11 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "name": "lTokenAddress", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "LTokenSignalEvent", "type": "event" }, { @@ -13055,21 +13303,7 @@ }, { "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -13080,9 +13314,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "pendingOwner", + "name": "owner", "outputs": [ { "internalType": "address", @@ -13110,6 +13357,19 @@ "inputs": [], "name": "renounceOwnership", "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -13123,7 +13383,7 @@ ], "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -13175,8 +13435,8 @@ } ] }, - "GlobalOwner_Implementation": { - "address": "0x36811e4b6d5f890bd0ac858B69499F9a7b2dc05F", + "LTokenSignaler_Implementation": { + "address": "0xf97DfCed60FBeF9452dbEd18778a4Fe6c14bBAF4", "abi": [ { "inputs": [], @@ -13234,17 +13494,11 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "name": "lTokenAddress", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "LTokenSignalEvent", "type": "event" }, { @@ -13281,21 +13535,7 @@ }, { "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -13306,9 +13546,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "pendingOwner", + "name": "owner", "outputs": [ { "internalType": "address", @@ -13336,6 +13589,19 @@ "inputs": [], "name": "renounceOwnership", "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -13349,7 +13615,7 @@ ], "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -13385,8 +13651,8 @@ } ] }, - "GlobalOwner_Proxy": { - "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", + "LTokenSignaler_Proxy": { + "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", "abi": [ { "inputs": [ @@ -13459,8 +13725,8 @@ } ] }, - "GlobalPause": { - "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", + "LUSDC": { + "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", "abi": [ { "anonymous": false, @@ -13520,12 +13786,12 @@ "inputs": [ { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" } ], - "name": "Initialized", + "name": "APRChangeEvent", "type": "event" }, { @@ -13533,31 +13799,67 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "int256", + "name": "id", + "type": "int256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" } ], - "name": "OwnershipTransferred", + "name": "ActivityEvent", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "Paused", + "name": "Approval", "type": "event" }, { @@ -13565,281 +13867,291 @@ "inputs": [ { "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "name": "Unpaused", + "name": "Initialized", "type": "event" }, { - "inputs": [], - "name": "globalOwner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "account", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "MintedRewardsEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "globalOwner_", + "name": "previousOwner", "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" + "name": "TVLChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "newImplementation", + "name": "account", "type": "address" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "owner", "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_logic", + "name": "spender", "type": "address" }, { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "GlobalPause_Implementation": { - "address": "0xd4568D313FA2d5C6EBA37C9f30F6FB8D1C552ddd", - "abi": [ - { - "inputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "uint256", + "name": "requestId", + "type": "uint256" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "claimFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ { - "indexed": false, "internalType": "uint8", - "name": "version", + "name": "", "type": "uint8" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "spender", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", "name": "account", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "depositFor", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Upgraded", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { "inputs": [], - "name": "globalOwner", + "name": "feesRateUD7x3", "outputs": [ { - "internalType": "address", + "internalType": "uint32", "name": "", - "type": "address" + "type": "uint32" } ], "stateMutability": "view", @@ -13847,20 +14159,31 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "account", "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "fund", "outputs": [ { "internalType": "address", @@ -13873,19 +14196,12 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "getAPR", "outputs": [ { - "internalType": "bool", + "internalType": "uint16", "name": "", - "type": "bool" + "type": "uint16" } ], "stateMutability": "view", @@ -13893,213 +14209,202 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "getExpectedRetained", "outputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getWithdrawnAmountAndFees", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "globalBlacklist", + "outputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" - } - ] - }, - "GlobalPause_Proxy": { - "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", - "abi": [ + }, { - "inputs": [ + "inputs": [], + "name": "globalPause", + "outputs": [ { "internalType": "address", - "name": "_logic", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "stateMutability": "payable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "spender", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "increaseAllowance", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "globalOwner_", "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "LDYStaking": { - "address": "0x4e80beDBD58b084a8946b7BA6814c28906Be2d02", - "abi": [ - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "globalPause_", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "globalBlacklist_", "type": "address" - } - ], - "name": "OwnershipTransferStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "ldyStaking_", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "underlyingToken", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "acceptOwnership", + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "instantWithdrawal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "invested", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyStaking", + "outputs": [ + { + "internalType": "contract LDYStaking", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "listenerContract", "type": "address" } ], - "name": "highTierAccounts", + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "bool", + "internalType": "string", "name": "", - "type": "bool" + "type": "string" } ], "stateMutability": "view", @@ -14120,40 +14425,48 @@ }, { "inputs": [], - "name": "pendingOwner", + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "renounceOwnership", + "name": "processQueuedRequests", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "proxiableUUID", + "outputs": [ { - "internalType": "bool", - "name": "status", - "type": "bool" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "setHighTierAccount", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -14164,11 +14477,11 @@ "type": "address" } ], - "name": "tierOf", + "name": "realBalanceOf", "outputs": [ { "internalType": "uint256", - "name": "tier", + "name": "", "type": "uint256" } ], @@ -14176,124 +14489,98 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "realTotalSupply", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "LTokenSignaler": { - "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", - "abi": [ + }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "tokenAddress", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "LTokenSignalEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "globalOwner", + "name": "rewardsRedirectsFromTo", "outputs": [ { "internalType": "address", @@ -14308,18 +14595,16 @@ "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "", "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "rewardsRedirectsToFrom", "outputs": [ { "internalType": "address", @@ -14331,34 +14616,40 @@ "type": "function" }, { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" } ], - "stateMutability": "view", + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "lTokenAddress", + "internalType": "address payable", + "name": "fund_", "type": "address" } ], - "name": "signalLToken", + "name": "setFund", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -14367,24 +14658,24 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "ldyStakingAddress", "type": "address" } ], - "name": "transferOwnership", + "name": "setLDYStaking", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "newImplementation", - "type": "address" + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" } ], - "name": "upgradeTo", + "name": "setRetentionRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -14392,169 +14683,169 @@ { "inputs": [ { - "internalType": "address", - "name": "newImplementation", + "internalType": "address payable", + "name": "withdrawer_", "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "upgradeToAndCall", + "name": "setWithdrawer", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_logic", + "name": "from", "type": "address" }, { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "address", + "name": "to", + "type": "address" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "LTokenSignaler_Implementation": { - "address": "0xf97DfCed60FBeF9452dbEd18778a4Fe6c14bBAF4", - "abi": [ - { - "inputs": [], + "name": "startRewardsRedirection", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "from", "type": "address" }, { - "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "to", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalQueued", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "LTokenSignalEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "to", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "inputs": [], - "name": "globalOwner", + "name": "transferFrom", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "newOwner", "type": "address" } ], - "name": "initialize", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", "outputs": [ { - "internalType": "address", + "internalType": "contract ITransfersListener", "name": "", "type": "address" } @@ -14564,12 +14855,12 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "unclaimedFees", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -14577,8 +14868,14 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], + "name": "underlying", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, @@ -14586,11 +14883,11 @@ "inputs": [ { "internalType": "address", - "name": "lTokenAddress", + "name": "listenerContract", "type": "address" } ], - "name": "signalLToken", + "name": "unlistenToTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -14599,12 +14896,18 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], + "name": "unmintedRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, @@ -14638,139 +14941,115 @@ "outputs": [], "stateMutability": "payable", "type": "function" - } - ] - }, - "LTokenSignaler_Proxy": { - "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" - }, + "inputs": [], + "name": "usableUnderlyings", + "outputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "stateMutability": "payable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "account", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "withdrawTo", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "LUSDC": { - "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", - "abi": [ - { - "anonymous": false, - "inputs": [ + "name": "withdrawalQueue", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "account", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "withdrawalQueueCursor", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawer", + "outputs": [ + { + "internalType": "address payable", + "name": "", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "_logic", "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "Upgraded", - "type": "event" - }, - { "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - }, + "type": "constructor" + } + ] + }, + "LUSDC_Implementation": { + "address": "0xa2B6487Cc828Ba9260013Ec671F29a4a7778a64B", + "abi": [ { "anonymous": false, "inputs": [ @@ -14822,6 +15101,12 @@ "internalType": "enum LToken.Status", "name": "newStatus", "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" } ], "name": "ActivityEvent", @@ -14831,13 +15116,32 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "owner", + "name": "previousAdmin", "type": "address" }, { - "indexed": true, + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, "internalType": "address", "name": "spender", "type": "address" @@ -14852,6 +15156,19 @@ "name": "Approval", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -14973,6 +15290,19 @@ "name": "Unpaused", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, { "inputs": [ { @@ -16018,7 +16348,12 @@ ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "LUSDC_Proxy": { + "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", + "abi": [ { "inputs": [ { @@ -16034,73 +16369,6 @@ ], "stateMutability": "payable", "type": "constructor" - } - ] - }, - "LUSDC_Implementation": { - "address": "0xa2B6487Cc828Ba9260013Ec671F29a4a7778a64B", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint16", - "name": "newAPRUD7x3", - "type": "uint16" - } - ], - "name": "APRChangeEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "int256", - "name": "id", - "type": "int256" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "enum LToken.Action", - "name": "action", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amountAfterFees", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum LToken.Status", - "name": "newStatus", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "int256", - "name": "newId", - "type": "int256" - } - ], - "name": "ActivityEvent", - "type": "event" }, { "anonymous": false, @@ -16127,23 +16395,11 @@ { "indexed": true, "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", + "name": "beacon", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Approval", + "name": "BeaconUpgraded", "type": "event" }, { @@ -16152,25 +16408,61 @@ { "indexed": true, "internalType": "address", - "name": "beacon", + "name": "implementation", "type": "address" } ], - "name": "BeaconUpgraded", + "name": "Upgraded", "type": "event" }, { - "anonymous": false, + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "PreMining": { + "address": "0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c", + "abi": [ + { "inputs": [ { - "indexed": false, + "internalType": "address", + "name": "lTokenAddress_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxDistributedLDY_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockedHardCap_", + "type": "uint256" + }, + { "internalType": "uint8", - "name": "version", + "name": "minLockDuration_", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "maxLockDuration_", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "vestingDuration_", "type": "uint8" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -16184,17 +16476,17 @@ { "indexed": false, "internalType": "uint256", - "name": "balanceBefore", + "name": "amount", "type": "uint256" }, { "indexed": false, - "internalType": "uint256", - "name": "rewards", - "type": "uint256" + "internalType": "uint8", + "name": "duration", + "type": "uint8" } ], - "name": "MintedRewardsEvent", + "name": "Lock", "type": "event" }, { @@ -16213,33 +16505,7 @@ "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTVL", - "type": "uint256" - } - ], - "name": "TVLChangeEvent", + "name": "OwnershipTransferStarted", "type": "event" }, { @@ -16248,23 +16514,17 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", + "name": "OwnershipTransferred", "type": "event" }, { @@ -16277,41 +16537,63 @@ "type": "address" } ], - "name": "Unpaused", + "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "implementation", + "name": "account", "type": "address" } ], - "name": "Upgraded", + "name": "Unpaused", "type": "event" }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", + "name": "", "type": "address" } ], - "name": "allowance", + "name": "accountsLocks", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "uint240", + "name": "amount", + "type": "uint240" + }, + { + "internalType": "uint8", + "name": "duration", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "hasUnlocked", + "type": "bool" + }, + { + "internalType": "uint216", + "name": "claimedRewards", + "type": "uint216" + }, + { + "internalType": "uint40", + "name": "lockEndTimestamp", + "type": "uint40" } ], "stateMutability": "view", @@ -16321,23 +16603,38 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "account", "type": "address" - }, + } + ], + "name": "availableToClaim", + "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "approve", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimPhaseStartTimestamp", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimRewards", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -16349,7 +16646,7 @@ "type": "address" } ], - "name": "balanceOf", + "name": "eligibleRewardsOf", "outputs": [ { "internalType": "uint256", @@ -16360,53 +16657,29 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" - } - ], - "name": "cancelWithdrawalRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], - "name": "claimFees", + "name": "endDepositPhase", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "hasClaimPhaseStarted", "outputs": [ { - "internalType": "uint8", + "internalType": "bool", "name": "", - "type": "uint8" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", + "inputs": [], + "name": "hasDepositPhaseEnded", "outputs": [ { "internalType": "bool", @@ -16414,54 +16687,50 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "hasRecoveryPhaseStarted", + "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "deposit", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "instantUnlock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "depositFor", + "inputs": [], + "name": "lToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract LToken", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "feesRateUD7x3", + "name": "ldyToken", "outputs": [ { - "internalType": "uint32", + "internalType": "contract IERC20", "name": "", - "type": "uint32" + "type": "address" } ], "stateMutability": "view", @@ -16471,34 +16740,28 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" - } - ], - "name": "frozenRequests", - "outputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" }, { - "internalType": "uint96", - "name": "amount", - "type": "uint96" + "internalType": "uint8", + "name": "duration", + "type": "uint8" } ], - "stateMutability": "view", + "name": "lock", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "fund", + "name": "lockedHardCap", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -16506,12 +16769,12 @@ }, { "inputs": [], - "name": "getAPR", + "name": "maxDistributedLDY", "outputs": [ { - "internalType": "uint16", + "internalType": "uint256", "name": "", - "type": "uint16" + "type": "uint256" } ], "stateMutability": "view", @@ -16519,41 +16782,38 @@ }, { "inputs": [], - "name": "getExpectedRetained", + "name": "maxLockDuration", "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "maxWeight", + "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "getWithdrawnAmountAndFees", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minLockDuration", "outputs": [ { - "internalType": "uint256", - "name": "withdrawnAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fees", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", @@ -16561,7 +16821,7 @@ }, { "inputs": [], - "name": "globalBlacklist", + "name": "owner", "outputs": [ { "internalType": "address", @@ -16574,12 +16834,19 @@ }, { "inputs": [], - "name": "globalOwner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -16587,7 +16854,7 @@ }, { "inputs": [], - "name": "globalPause", + "name": "pendingOwner", "outputs": [ { "internalType": "address", @@ -16598,97 +16865,80 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "processUnlockRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "addedValue", + "name": "amount", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "recoverERC20", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "globalOwner_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalPause_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalBlacklist_", - "type": "address" - }, - { - "internalType": "address", - "name": "ldyStaking_", - "type": "address" - }, + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestUnlock", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "underlyingToken", + "name": "ldyTokenAddress", "type": "address" } ], - "name": "initialize", + "name": "setLDYToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "instantWithdrawal", + "inputs": [], + "name": "startClaimPhase", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "invested", - "outputs": [ - { - "internalType": "contract IERC20Upgradeable", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "startRecoveryPhase", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "ldyStaking", + "name": "totalLocked", "outputs": [ { - "internalType": "contract LDYStaking", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -16698,223 +16948,290 @@ "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "newOwner", "type": "address" } ], - "name": "listenToTransfers", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "underlyingToken", "outputs": [ { - "internalType": "string", + "internalType": "contract IERC20", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "unlockRequests", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "unlockRequestsCursor", + "outputs": [ { "internalType": "uint256", - "name": "requestId", + "name": "", "type": "uint256" } ], - "name": "processBigQueuedRequest", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "processQueuedRequests", + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "proxiableUUID", + "name": "vestingDuration", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint8", "name": "", - "type": "bytes32" + "type": "uint8" } ], "stateMutability": "view", "type": "function" - }, + } + ] + } + } + } + ], + "59140": [ + { + "name": "lineaGoerli", + "chainId": "59140", + "contracts": { + "APRHistory": { + "address": "0xaaf59CC7d6E6cDc78d3eD8fb3701e93f8DF95429", + "abi": [ { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref2", + "type": "tuple" } ], - "name": "realBalanceOf", + "name": "eq", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "realTotalSupply", + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref", + "type": "tuple" + } + ], + "name": "incrementReference", "outputs": [ { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", "name": "", - "type": "uint256" + "type": "tuple" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" - }, + } + ] + }, + "GlobalBlacklist": { + "address": "0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf", + "abi": [ { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "tokenAddress", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverUnderlying", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "name": "repatriate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, + "name": "BeaconUpgraded", + "type": "event" + }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "requestWithdrawal", - "outputs": [], + "name": "Upgraded", + "type": "event" + }, + { "stateMutability": "payable", - "type": "function" + "type": "fallback" }, { - "inputs": [], - "name": "retentionRateUD7x3", - "outputs": [ + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "name": "rewardsRedirectsFromTo", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" } ], - "name": "rewardsRedirectsToFrom", + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -16928,12 +17245,12 @@ { "inputs": [ { - "internalType": "uint16", - "name": "aprUD7x3", - "type": "uint16" + "internalType": "address", + "name": "globalOwner_", + "type": "address" } ], - "name": "setAPR", + "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -16941,51 +17258,77 @@ { "inputs": [ { - "internalType": "uint32", - "name": "feesRateUD7x3_", - "type": "uint32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "setFeesRate", - "outputs": [], - "stateMutability": "nonpayable", + "name": "isBlacklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "address payable", - "name": "fund_", + "internalType": "address", + "name": "", "type": "address" } ], - "name": "setFund", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "ldyStakingAddress", + "name": "newOwner", "type": "address" } ], - "name": "setLDYStaking", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint32", - "name": "retentionRateUD7x3_", - "type": "uint32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "setRetentionRate", + "name": "unBlacklist", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -16993,12 +17336,12 @@ { "inputs": [ { - "internalType": "address payable", - "name": "withdrawer_", + "internalType": "address", + "name": "newImplementation", "type": "address" } ], - "name": "setWithdrawer", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -17007,157 +17350,176 @@ "inputs": [ { "internalType": "address", - "name": "from", + "name": "newImplementation", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "startRewardsRedirection", + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "_logic", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "stopRewardsRedirection", - "outputs": [], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalBlacklist_Implementation": { + "address": "0x13B0722ce74587bAAc4C3069901496D4A94f90d2", + "abi": [ + { + "inputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { - "inputs": [], - "name": "totalQueued", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "to", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "transfer", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Upgraded", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "transferFrom", + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "globalOwner_", "type": "address" } ], - "name": "transferOwnership", + "name": "initialize", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "transfersListeners", + "name": "isBlacklisted", "outputs": [ { - "internalType": "contract ITransfersListener", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -17165,12 +17527,12 @@ }, { "inputs": [], - "name": "unclaimedFees", + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -17178,28 +17540,35 @@ }, { "inputs": [], - "name": "underlying", + "name": "proxiableUUID", "outputs": [ { - "internalType": "contract IERC20Upgradeable", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "newOwner", "type": "address" } ], - "name": "unlistenToTransfers", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -17210,15 +17579,9 @@ "type": "address" } ], - "name": "unmintedRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -17251,98 +17614,11 @@ "outputs": [], "stateMutability": "payable", "type": "function" - }, - { - "inputs": [], - "name": "usableUnderlyings", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "withdrawTo", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "withdrawalQueue", - "outputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint96", - "name": "amount", - "type": "uint96" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalQueueCursor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawer", - "outputs": [ - { - "internalType": "address payable", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" } ] }, - "LUSDC_Proxy": { - "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", + "GlobalBlacklist_Proxy": { + "address": "0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf", "abi": [ { "inputs": [ @@ -17415,44 +17691,27 @@ } ] }, - "PreMining": { - "address": "0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c", + "GlobalOwner": { + "address": "0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6", "abi": [ { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "lTokenAddress_", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "maxDistributedLDY_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "lockedHardCap_", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "minLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "maxLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "vestingDuration_", - "type": "uint8" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "AdminChanged", + "type": "event" }, { "anonymous": false, @@ -17460,23 +17719,11 @@ { "indexed": true, "internalType": "address", - "name": "account", + "name": "beacon", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "duration", - "type": "uint8" } ], - "name": "Lock", + "name": "BeaconUpgraded", "type": "event" }, { @@ -17485,24 +17732,39 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "name": "implementation", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "Upgraded", "type": "event" }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" @@ -17514,33 +17776,26 @@ "type": "address" } ], - "name": "OwnershipTransferred", + "name": "OwnershipTransferStarted", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "previousOwner", "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "Unpaused", + "name": "OwnershipTransferred", "type": "event" }, { @@ -17551,58 +17806,33 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "name": "accountsLocks", - "outputs": [ - { - "internalType": "uint240", - "name": "amount", - "type": "uint240" - }, - { - "internalType": "uint8", - "name": "duration", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "hasUnlocked", - "type": "bool" - }, - { - "internalType": "uint216", - "name": "claimedRewards", - "type": "uint216" - }, - { - "internalType": "uint40", - "name": "lockEndTimestamp", - "type": "uint40" - } - ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "availableToClaim", + "inputs": [], + "name": "pendingOwner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -17610,12 +17840,12 @@ }, { "inputs": [], - "name": "claimPhaseStartTimestamp", + "name": "proxiableUUID", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -17623,7 +17853,7 @@ }, { "inputs": [], - "name": "claimRewards", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -17632,181 +17862,180 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "eligibleRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "endDepositPhase", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "hasClaimPhaseStarted", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "stateMutability": "view", + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "hasDepositPhaseEnded", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { - "inputs": [], - "name": "hasRecoveryPhaseStarted", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" - }, + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalOwner_Implementation": { + "address": "0x158b8b830C5f021Fb853E5124bC4f0F9f3c146c3", + "abi": [ { "inputs": [], - "name": "instantUnlock", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "lToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract LToken", - "name": "", + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { - "inputs": [], - "name": "ldyToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "beacon", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { + "indexed": false, "internalType": "uint8", - "name": "duration", + "name": "version", "type": "uint8" } ], - "name": "lock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Initialized", + "type": "event" }, { - "inputs": [], - "name": "lockedHardCap", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferStarted", + "type": "event" }, { - "inputs": [], - "name": "maxDistributedLDY", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "maxLockDuration", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" }, { "inputs": [], - "name": "maxWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "minLockDuration", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -17824,19 +18053,12 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "pendingOwner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -17844,12 +18066,12 @@ }, { "inputs": [], - "name": "pendingOwner", + "name": "proxiableUUID", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -17857,7 +18079,7 @@ }, { "inputs": [], - "name": "processUnlockRequests", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -17866,278 +18088,189 @@ "inputs": [ { "internalType": "address", - "name": "tokenAddress", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "recoverERC20", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "requestUnlock", + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" - }, + } + ] + }, + "GlobalOwner_Proxy": { + "address": "0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "ldyTokenAddress", + "name": "_logic", "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "setLDYToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startClaimPhase", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startRecoveryPhase", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "payable", + "type": "constructor" }, { - "inputs": [], - "name": "totalLocked", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "beacon", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "underlyingToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "implementation", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" }, { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "GlobalPause": { + "address": "0x4fB551213757619558A93a599a08524e9Dd59C67", + "abi": [ + { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "unlockRequests", - "outputs": [ + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "beacon", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "unlockRequestsCursor", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "payable", + "type": "fallback" }, { - "inputs": [], - "name": "vestingDuration", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - } - } - } - ], - "59140": [ - { - "name": "lineaGoerli", - "chainId": "59140", - "contracts": { - "APRHistory": { - "address": "0xaaf59CC7d6E6cDc78d3eD8fb3701e93f8DF95429", - "abi": [ - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref1", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref2", - "type": "tuple" - } - ], - "name": "eq", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" + "stateMutability": "payable", + "type": "receive" }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref", - "type": "tuple" - } - ], - "name": "incrementReference", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "pure", - "type": "function" - } - ] - }, - "GlobalBlacklist": { - "address": "0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf", - "abi": [ { "anonymous": false, "inputs": [ { "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "name": "AdminChanged", + "name": "Initialized", "type": "event" }, { @@ -18146,78 +18279,44 @@ { "indexed": true, "internalType": "address", - "name": "beacon", + "name": "previousOwner", "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { "indexed": true, "internalType": "address", - "name": "implementation", + "name": "newOwner", "type": "address" } ], - "name": "Upgraded", + "name": "OwnershipTransferred", "type": "event" }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - }, { "anonymous": false, "inputs": [ { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", + "name": "Paused", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { "inputs": [], @@ -18246,19 +18345,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isBlacklisted", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -18266,12 +18359,19 @@ }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -18311,14 +18411,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18372,8 +18466,8 @@ } ] }, - "GlobalBlacklist_Implementation": { - "address": "0x13B0722ce74587bAAc4C3069901496D4A94f90d2", + "GlobalPause_Implementation": { + "address": "0x61Ecdf96b567B081A098Aee0B63157bD79482593", "abi": [ { "inputs": [], @@ -18448,68 +18542,75 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "implementation", + "name": "account", "type": "address" } ], - "name": "Upgraded", + "name": "Paused", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "globalOwner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "implementation", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "globalOwner", + "outputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "", "type": "address" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "globalOwner_", "type": "address" } ], - "name": "isBlacklisted", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -18517,12 +18618,19 @@ }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -18562,14 +18670,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18607,8 +18709,8 @@ } ] }, - "GlobalBlacklist_Proxy": { - "address": "0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf", + "GlobalPause_Proxy": { + "address": "0x4fB551213757619558A93a599a08524e9Dd59C67", "abi": [ { "inputs": [ @@ -18681,8 +18783,32 @@ } ] }, - "GlobalOwner": { - "address": "0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6", + "LDYStaking": { + "address": "0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "LTokenSignaler": { + "address": "0x04a678103bE57c3d81100fe08e43C94e50adC37B", "abi": [ { "anonymous": false, @@ -18756,17 +18882,11 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "name": "lTokenAddress", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "LTokenSignalEvent", "type": "event" }, { @@ -18790,21 +18910,7 @@ }, { "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -18815,9 +18921,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "pendingOwner", + "name": "owner", "outputs": [ { "internalType": "address", @@ -18845,6 +18964,19 @@ "inputs": [], "name": "renounceOwnership", "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -18858,7 +18990,7 @@ ], "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -18910,8 +19042,8 @@ } ] }, - "GlobalOwner_Implementation": { - "address": "0x158b8b830C5f021Fb853E5124bC4f0F9f3c146c3", + "LTokenSignaler_Implementation": { + "address": "0xc691ba2ee970D42dD3fA52777a5416181c3F8C3d", "abi": [ { "inputs": [], @@ -18969,17 +19101,11 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "name": "lTokenAddress", "type": "address" } ], - "name": "OwnershipTransferStarted", + "name": "LTokenSignalEvent", "type": "event" }, { @@ -19016,21 +19142,7 @@ }, { "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "globalOwner", "outputs": [ { "internalType": "address", @@ -19041,9 +19153,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "pendingOwner", + "name": "owner", "outputs": [ { "internalType": "address", @@ -19071,6 +19196,19 @@ "inputs": [], "name": "renounceOwnership", "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -19084,7 +19222,7 @@ ], "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -19120,8 +19258,8 @@ } ] }, - "GlobalOwner_Proxy": { - "address": "0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6", + "LTokenSignaler_Proxy": { + "address": "0x04a678103bE57c3d81100fe08e43C94e50adC37B", "abi": [ { "inputs": [ @@ -19194,8 +19332,8 @@ } ] }, - "GlobalPause": { - "address": "0x4fB551213757619558A93a599a08524e9Dd59C67", + "LUSDC": { + "address": "0x6D3D88028eBE4cab9230Ddae7717b1B40508194d", "abi": [ { "anonymous": false, @@ -19255,12 +19393,12 @@ "inputs": [ { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" } ], - "name": "Initialized", + "name": "APRChangeEvent", "type": "event" }, { @@ -19268,232 +19406,137 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "int256", + "name": "id", + "type": "int256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, { "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" } ], - "name": "Paused", + "name": "ActivityEvent", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "inputs": [], - "name": "globalOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { + "indexed": true, "internalType": "address", - "name": "globalOwner_", + "name": "owner", "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "spender", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "address", - "name": "newOwner", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "newImplementation", - "type": "address" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newImplementation", + "name": "account", "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" }, { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "GlobalPause_Implementation": { - "address": "0x61Ecdf96b567B081A098Aee0B63157bD79482593", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "MintedRewardsEvent", + "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "previousAdmin", + "name": "previousOwner", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "newAdmin", + "name": "newOwner", "type": "address" } ], - "name": "AdminChanged", + "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "beacon", + "name": "account", "type": "address" } ], - "name": "BeaconUpgraded", + "name": "Paused", "type": "event" }, { @@ -19501,12 +19544,12 @@ "inputs": [ { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" } ], - "name": "Initialized", + "name": "TVLChangeEvent", "type": "event" }, { @@ -19515,30 +19558,23 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "to", "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "Paused", + "name": "Transfer", "type": "event" }, { @@ -19555,26 +19591,24 @@ "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "name": "Upgraded", - "type": "event" - }, - { - "inputs": [], - "name": "globalOwner", + "name": "allowance", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -19584,97 +19618,111 @@ "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "approve", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "requestId", + "type": "uint256" } ], - "stateMutability": "view", + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", + "name": "claimFees", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "unpause", - "outputs": [], + "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": "newImplementation", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "upgradeTo", + "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -19683,253 +19731,246 @@ "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "account", "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "name": "depositFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", "type": "function" - } - ] - }, - "GlobalPause_Proxy": { - "address": "0x4fB551213757619558A93a599a08524e9Dd59C67", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" - }, + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "stateMutability": "payable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ + { "internalType": "address", - "name": "previousAdmin", + "name": "account", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "fund", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getAPR", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint16", + "name": "", + "type": "uint16" } ], - "name": "Upgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "fallback" + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "LDYStaking": { - "address": "0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6", - "abi": [ { "inputs": [ { "internalType": "address", "name": "account", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "tierOf", + "name": "getWithdrawnAmountAndFees", "outputs": [ { "internalType": "uint256", - "name": "tier", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" - } - ] - }, - "LTokenSignaler": { - "address": "0x04a678103bE57c3d81100fe08e43C94e50adC37B", - "abi": [ + }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "globalBlacklist", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "globalOwner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "globalPause", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "", "type": "address" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "increaseAllowance", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "LTokenSignalEvent", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "globalOwner_", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "globalPause_", "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "globalOwner", - "outputs": [ + }, { "internalType": "address", - "name": "", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, + { + "internalType": "address", + "name": "underlyingToken", "type": "address" } ], - "stateMutability": "view", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "globalOwner_", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "initialize", + "name": "instantWithdrawal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "invested", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20Upgradeable", "name": "", "type": "address" } @@ -19939,205 +19980,200 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "ldyStaking", "outputs": [ { - "internalType": "bytes32", + "internalType": "contract LDYStaking", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "lTokenAddress", + "name": "listenerContract", "type": "address" } ], - "name": "signalLToken", + "name": "listenToTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_logic", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256", + "name": "requestId", + "type": "uint256" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "LTokenSignaler_Implementation": { - "address": "0xc691ba2ee970D42dD3fA52777a5416181c3F8C3d", - "abi": [ + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], + "name": "processQueuedRequests", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "proxiableUUID", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "account", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "realBalanceOf", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "realTotalSupply", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "LTokenSignalEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "tokenAddress", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" - }, + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { "inputs": [], - "name": "globalOwner", + "name": "retentionRateUD7x3", "outputs": [ { - "internalType": "address", + "internalType": "uint32", "name": "", - "type": "address" + "type": "uint32" } ], "stateMutability": "view", @@ -20147,18 +20183,11 @@ "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "", "type": "address" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "rewardsRedirectsFromTo", "outputs": [ { "internalType": "address", @@ -20170,34 +20199,51 @@ "type": "function" }, { - "inputs": [], - "name": "proxiableUUID", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" } ], - "name": "signalLToken", + "name": "setFeesRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -20205,25 +20251,25 @@ { "inputs": [ { - "internalType": "address", - "name": "newOwner", + "internalType": "address payable", + "name": "fund_", "type": "address" } ], - "name": "transferOwnership", + "name": "setFund", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "ldyStakingAddress", "type": "address" } ], - "name": "upgradeTo", + "name": "setLDYStaking", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -20231,369 +20277,281 @@ { "inputs": [ { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" } ], - "name": "upgradeToAndCall", + "name": "setRetentionRate", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "LTokenSignaler_Proxy": { - "address": "0x04a678103bE57c3d81100fe08e43C94e50adC37B", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_logic", + "internalType": "address payable", + "name": "withdrawer_", "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "stateMutability": "payable", - "type": "constructor" + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "from", "type": "address" }, { - "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "to", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "Upgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "fallback" + "inputs": [], + "name": "totalQueued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "LUSDC": { - "address": "0x6D3D88028eBE4cab9230Ddae7717b1B40508194d", - "abi": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "to", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "from", "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "to", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - }, - { - "anonymous": false, - "inputs": [ + "name": "transferFrom", + "outputs": [ { - "indexed": false, - "internalType": "uint16", - "name": "newAPRUD7x3", - "type": "uint16" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "APRChangeEvent", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "int256", - "name": "id", - "type": "int256" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" - }, - { - "indexed": true, - "internalType": "enum LToken.Action", - "name": "action", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amountAfterFees", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum LToken.Status", - "name": "newStatus", - "type": "uint8" } ], - "name": "ActivityEvent", - "type": "event" + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" }, { - "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", + "name": "", "type": "uint256" } ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "transfersListeners", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "balanceBefore", - "type": "uint256" - }, + "inputs": [], + "name": "unclaimedFees", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "rewards", + "name": "", "type": "uint256" } ], - "name": "MintedRewardsEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "underlying", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "internalType": "contract IERC20Upgradeable", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "listenerContract", "type": "address" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTVL", - "type": "uint256" - } - ], - "name": "TVLChangeEvent", - "type": "event" + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "to", + "name": "account", "type": "address" - }, + } + ], + "name": "unmintedRewardsOf", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "newImplementation", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "owner", + "name": "newImplementation", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "allowance", + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", "outputs": [ { "internalType": "uint256", @@ -20608,7 +20566,7 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "account", "type": "address" }, { @@ -20617,7 +20575,7 @@ "type": "uint256" } ], - "name": "approve", + "name": "withdrawTo", "outputs": [ { "internalType": "bool", @@ -20625,56 +20583,54 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "withdrawalQueue", + "outputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], - "name": "cancelWithdrawalRequest", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "claimFees", - "outputs": [], - "stateMutability": "nonpayable", + "name": "withdrawalQueueCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "withdrawer", "outputs": [ { - "internalType": "uint8", + "internalType": "address payable", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -20684,298 +20640,289 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "_logic", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "nonpayable", - "type": "function" - }, + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "LUSDC_Implementation": { + "address": "0x89123270815c60494aC0Add366A9b1AC184C6183", + "abi": [ { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" } ], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "APRChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, + { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" - } - ], - "name": "depositFor", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "feesRateUD7x3", - "outputs": [ + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, { - "internalType": "uint32", - "name": "", - "type": "uint32" + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "ActivityEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "frozenRequests", - "outputs": [ - { + "indexed": false, "internalType": "address", - "name": "account", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint96", - "name": "amount", - "type": "uint96" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { - "inputs": [], - "name": "fund", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "owner", "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { - "inputs": [], - "name": "getAPR", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint16", - "name": "", - "type": "uint16" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "getExpectedRetained", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "getWithdrawnAmountAndFees", - "outputs": [ - { - "internalType": "uint256", - "name": "withdrawnAmount", + "name": "balanceBefore", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "fees", + "name": "rewards", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "MintedRewardsEvent", + "type": "event" }, { - "inputs": [], - "name": "globalBlacklist", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "globalOwner", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "globalPause", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, + "name": "Paused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "newTVL", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TVLChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "globalOwner_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalPause_", + "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "globalBlacklist_", + "name": "to", "type": "address" }, { - "internalType": "address", - "name": "ldyStaking_", - "type": "address" - }, + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "underlyingToken", + "name": "account", "type": "address" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "instantWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [], - "name": "invested", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20Upgradeable", - "name": "", + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ldyStaking", + "name": "allowance", "outputs": [ { - "internalType": "contract LDYStaking", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -20985,49 +20932,40 @@ "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "listenToTransfers", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", + "name": "approve", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "balanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -21041,26 +20979,26 @@ "type": "uint256" } ], - "name": "processBigQueuedRequest", + "name": "cancelWithdrawalRequest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "processQueuedRequests", + "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "proxiableUUID", + "name": "decimals", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint8", "name": "", - "type": "bytes32" + "type": "uint8" } ], "stateMutability": "view", @@ -21070,95 +21008,66 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" - } - ], - "name": "realBalanceOf", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "subtractedValue", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "realTotalSupply", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverUnderlying", + "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "repatriate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "depositFor", + "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "requestWithdrawal", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "retentionRateUD7x3", + "name": "feesRateUD7x3", "outputs": [ { "internalType": "uint32", @@ -21172,36 +21081,30 @@ { "inputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "name": "rewardsRedirectsFromTo", + "name": "frozenRequests", "outputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "rewardsRedirectsToFrom", + "inputs": [], + "name": "fund", "outputs": [ { "internalType": "address", @@ -21213,127 +21116,68 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getAPR", + "outputs": [ { "internalType": "uint16", - "name": "aprUD7x3", + "name": "", "type": "uint16" } ], - "name": "setAPR", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint32", - "name": "feesRateUD7x3_", - "type": "uint32" - } - ], - "name": "setFeesRate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "fund_", - "type": "address" - } - ], - "name": "setFund", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "ldyStakingAddress", - "type": "address" - } - ], - "name": "setLDYStaking", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "retentionRateUD7x3_", - "type": "uint32" - } - ], - "name": "setRetentionRate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ { - "internalType": "address payable", - "name": "withdrawer_", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "setWithdrawer", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "account", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "startRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getWithdrawnAmountAndFees", + "outputs": [ { - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "fees", + "type": "uint256" } ], - "name": "stopRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "globalBlacklist", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -21341,12 +21185,12 @@ }, { "inputs": [], - "name": "totalQueued", + "name": "globalOwner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -21354,12 +21198,12 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "globalPause", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -21369,16 +21213,16 @@ "inputs": [ { "internalType": "address", - "name": "to", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "addedValue", "type": "uint256" } ], - "name": "transfer", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -21393,71 +21237,56 @@ "inputs": [ { "internalType": "address", - "name": "from", + "name": "globalOwner_", "type": "address" }, { "internalType": "address", - "name": "to", + "name": "globalPause_", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, { "internalType": "address", - "name": "newOwner", + "name": "underlyingToken", "type": "address" } ], - "name": "transferOwnership", + "name": "initialize", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "name": "transfersListeners", - "outputs": [ - { - "internalType": "contract ITransfersListener", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "unclaimedFees", + "name": "invested", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -21465,10 +21294,10 @@ }, { "inputs": [], - "name": "underlying", + "name": "ldyStaking", "outputs": [ { - "internalType": "contract IERC20Upgradeable", + "internalType": "contract LDYStaking", "name": "", "type": "address" } @@ -21484,25 +21313,45 @@ "type": "address" } ], - "name": "unlistenToTransfers", + "name": "listenToTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "unmintedRewardsOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -21511,42 +21360,31 @@ { "inputs": [ { - "internalType": "address", - "name": "newImplementation", - "type": "address" + "internalType": "uint256", + "name": "requestId", + "type": "uint256" } ], - "name": "upgradeTo", + "name": "processBigQueuedRequest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", + "inputs": [], + "name": "processQueuedRequests", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "usableUnderlyings", + "name": "proxiableUUID", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -21558,69 +21396,98 @@ "internalType": "address", "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "withdrawTo", + "name": "realBalanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "realTotalSupply", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "name": "withdrawalQueue", - "outputs": [ + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "account", + "name": "tokenAddress", "type": "address" }, { - "internalType": "uint96", + "internalType": "uint256", "name": "amount", - "type": "uint96" + "type": "uint256" } ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "withdrawalQueueCursor", - "outputs": [ + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "withdrawer", + "name": "retentionRateUD7x3", "outputs": [ { - "internalType": "address payable", + "internalType": "uint32", "name": "", - "type": "address" + "type": "uint32" } ], "stateMutability": "view", @@ -21630,299 +21497,232 @@ "inputs": [ { "internalType": "address", - "name": "_logic", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "LUSDC_Implementation": { - "address": "0x89123270815c60494aC0Add366A9b1AC184C6183", - "abi": [ - { - "anonymous": false, - "inputs": [ + "name": "rewardsRedirectsFromTo", + "outputs": [ { - "indexed": false, - "internalType": "uint16", - "name": "newAPRUD7x3", - "type": "uint16" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "APRChangeEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "int256", - "name": "id", - "type": "int256" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "", "type": "address" }, { - "indexed": true, - "internalType": "enum LToken.Action", - "name": "action", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, "internalType": "uint256", - "name": "amountAfterFees", + "name": "", "type": "uint256" - }, + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ { - "indexed": false, - "internalType": "enum LToken.Status", - "name": "newStatus", - "type": "uint8" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "ActivityEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" } ], - "name": "AdminChanged", - "type": "event" + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "spender", + "internalType": "address payable", + "name": "fund_", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "ldyStakingAddress", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" } ], - "name": "Initialized", - "type": "event" + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", + "internalType": "address payable", + "name": "withdrawer_", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "balanceBefore", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "rewards", - "type": "uint256" } ], - "name": "MintedRewardsEvent", - "type": "event" + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "from", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "to", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTVL", - "type": "uint256" - } - ], - "name": "TVLChangeEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", + "name": "from", "type": "address" }, { - "indexed": true, "internalType": "address", "name": "to", "type": "address" - }, + } + ], + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalQueued", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "owner", + "name": "to", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "allowance", + "name": "transfer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", "type": "address" }, { @@ -21931,7 +21731,7 @@ "type": "uint256" } ], - "name": "approve", + "name": "transferFrom", "outputs": [ { "internalType": "bool", @@ -21946,49 +21746,55 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "balanceOf", - "outputs": [ + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], + "name": "transfersListeners", + "outputs": [ + { + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "unclaimedFees", + "outputs": [ { "internalType": "uint256", - "name": "requestId", + "name": "", "type": "uint256" } ], - "name": "cancelWithdrawalRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "claimFees", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "underlying", "outputs": [ { - "internalType": "uint8", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -21998,35 +21804,43 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "listenerContract", "type": "address" - }, + } + ], + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "decreaseAllowance", + "name": "unmintedRewardsOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "name": "deposit", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22035,37 +21849,55 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newImplementation", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "depositFor", + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "feesRateUD7x3", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", "outputs": [ { - "internalType": "uint32", + "internalType": "bool", "name": "", - "type": "uint32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -22076,7 +21908,7 @@ "type": "uint256" } ], - "name": "frozenRequests", + "name": "withdrawalQueue", "outputs": [ { "internalType": "address", @@ -22094,12 +21926,12 @@ }, { "inputs": [], - "name": "fund", + "name": "withdrawalQueueCursor", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -22107,54 +21939,6099 @@ }, { "inputs": [], - "name": "getAPR", + "name": "withdrawer", "outputs": [ { - "internalType": "uint16", + "internalType": "address payable", "name": "", - "type": "uint16" + "type": "address" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "LUSDC_Proxy": { + "address": "0x6D3D88028eBE4cab9230Ddae7717b1B40508194d", + "abi": [ { - "inputs": [], - "name": "getExpectedRetained", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + } + } + } + ], + "59144": [ + { + "name": "linea", + "chainId": "59144", + "contracts": { + "APRHistory": { + "address": "0x3F0Ff9947550d7Cf26549136552C785446ad4Ac5", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref2", + "type": "tuple" + } + ], + "name": "eq", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref", + "type": "tuple" + } + ], + "name": "incrementReference", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "GlobalBlacklist": { + "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", + "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": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalBlacklist_Implementation": { + "address": "0x896E3B079aa7A00413c074a5C888f3b96d4d3bcA", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": 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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", + "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": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ] + }, + "GlobalBlacklist_Proxy": { + "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "GlobalOwner": { + "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalOwner_Implementation": { + "address": "0x36811e4b6d5f890bd0ac858B69499F9a7b2dc05F", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": 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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ] + }, + "GlobalOwner_Proxy": { + "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "GlobalPause": { + "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalPause_Implementation": { + "address": "0xd4568D313FA2d5C6EBA37C9f30F6FB8D1C552ddd", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ] + }, + "GlobalPause_Proxy": { + "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "LDYStaking": { + "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "highTierAccounts", + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "setHighTierAccount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "LTokenSignaler": { + "address": "0xBA427517505b14C560854aED003304Fc69cbadfb", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "LTokenSignalEvent", + "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": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "LTokenSignaler_Implementation": { + "address": "0xEEe2CA6f97aC13D2D0dF1a2d45fC9ec30939c331", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "LTokenSignalEvent", + "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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ] + }, + "LTokenSignaler_Proxy": { + "address": "0xBA427517505b14C560854aED003304Fc69cbadfb", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "LUSDC": { + "address": "0x4AF215DbE27fc030F37f73109B85F421FAB45B7a", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" + } + ], + "name": "APRChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + } + ], + "name": "ActivityEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "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": "balanceBefore", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "name": "MintedRewardsEvent", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" + } + ], + "name": "TVLChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimFees", + "outputs": [], + "stateMutability": "nonpayable", + "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fund", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAPR", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getWithdrawnAmountAndFees", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "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": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "invested", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyStaking", + "outputs": [ + { + "internalType": "contract LDYStaking", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "realBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "realTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardsRedirectsFromTo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "fund_", + "type": "address" + } + ], + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ldyStakingAddress", + "type": "address" + } + ], + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" + } + ], + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawer_", + "type": "address" + } + ], + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalQueued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", + "outputs": [ + { + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unclaimedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "underlying", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unmintedRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "withdrawalQueue", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueueCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawer", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "LUSDC_Implementation": { + "address": "0x768fa735a0D894784fe38F52124B246dd6347D19", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" + } + ], + "name": "APRChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" + } + ], + "name": "ActivityEvent", + "type": "event" + }, + { + "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": "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "name": "MintedRewardsEvent", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" + } + ], + "name": "TVLChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimFees", + "outputs": [], + "stateMutability": "nonpayable", + "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fund", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAPR", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getWithdrawnAmountAndFees", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "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": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "invested", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyStaking", + "outputs": [ + { + "internalType": "contract LDYStaking", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "realBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "realTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardsRedirectsFromTo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "fund_", + "type": "address" + } + ], + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ldyStakingAddress", + "type": "address" + } + ], + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" + } + ], + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawer_", + "type": "address" + } + ], + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalQueued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", + "outputs": [ + { + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unclaimedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "underlying", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unmintedRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "withdrawalQueue", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueueCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawer", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "LUSDC_Proxy": { + "address": "0x4AF215DbE27fc030F37f73109B85F421FAB45B7a", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "PreMining": { + "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxDistributedLDY_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockedHardCap_", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "minLockDuration_", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "maxLockDuration_", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "vestingDuration_", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "duration", + "type": "uint8" + } + ], + "name": "Lock", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "accountsLocks", + "outputs": [ + { + "internalType": "uint240", + "name": "amount", + "type": "uint240" + }, + { + "internalType": "uint8", + "name": "duration", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "hasUnlocked", + "type": "bool" + }, + { + "internalType": "uint216", + "name": "claimedRewards", + "type": "uint216" + }, + { + "internalType": "uint40", + "name": "lockEndTimestamp", + "type": "uint40" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "availableToClaim", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimPhaseStartTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "eligibleRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endDepositPhase", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "hasClaimPhaseStarted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hasDepositPhaseEnded", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hasRecoveryPhaseStarted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "instantUnlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lToken", + "outputs": [ + { + "internalType": "contract LToken", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "duration", + "type": "uint8" + } + ], + "name": "lock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockedHardCap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxDistributedLDY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxLockDuration", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minLockDuration", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "processUnlockRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestUnlock", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ldyTokenAddress", + "type": "address" + } + ], + "name": "setLDYToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "startClaimPhase", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "startRecoveryPhase", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalLocked", + "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": [], + "name": "underlyingToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "unlockRequests", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockRequestsCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vestingDuration", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], "stateMutability": "view", "type": "function" + } + ] + } + } + } + ], + "84532": [ + { + "name": "baseSepolia", + "chainId": "84532", + "contracts": { + "APRHistory": { + "address": "0x9b508ABEbB61a0C24d28A728BB45834e440e4761", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref2", + "type": "tuple" + } + ], + "name": "eq", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref", + "type": "tuple" + } + ], + "name": "incrementReference", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "GlobalBlacklist": { + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "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": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" - }, + } + ], + "name": "Unblacklisted", + "type": "event" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getWithdrawnAmountAndFees", + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", "outputs": [ { - "internalType": "uint256", - "name": "withdrawnAmount", - "type": "uint256" - }, + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "fees", - "type": "uint256" + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], "stateMutability": "view", @@ -22162,7 +28039,7 @@ }, { "inputs": [], - "name": "globalBlacklist", + "name": "owner", "outputs": [ { "internalType": "address", @@ -22175,12 +28052,12 @@ }, { "inputs": [], - "name": "globalOwner", + "name": "proxiableUUID", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -22188,14 +28065,21 @@ }, { "inputs": [], - "name": "globalPause", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], + "name": "transferOwnership", + "outputs": [], "stateMutability": "view", "type": "function" }, @@ -22203,23 +28087,25 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], + "name": "upgradeTo", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -22227,67 +28113,168 @@ "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "newImplementation", "type": "address" }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "globalPause_", + "name": "_logic", "type": "address" }, { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalBlacklist_Implementation": { + "address": "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, "internalType": "address", - "name": "globalBlacklist_", + "name": "previousAdmin", "type": "address" }, { + "indexed": false, "internalType": "address", - "name": "ldyStaking_", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "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": "previousOwner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "underlyingToken", + "name": "newOwner", "type": "address" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "instantWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unblacklisted", + "type": "event" }, { - "inputs": [], - "name": "invested", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ { - "internalType": "contract IERC20Upgradeable", - "name": "", + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "ldyStaking", + "name": "globalOwner", "outputs": [ { - "internalType": "contract LDYStaking", + "internalType": "address", "name": "", "type": "address" } @@ -22299,23 +28286,29 @@ "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "globalOwner_", "type": "address" } ], - "name": "listenToTransfers", + "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "name", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], "stateMutability": "view", @@ -22336,186 +28329,281 @@ }, { "inputs": [], - "name": "paused", + "name": "proxiableUUID", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "processBigQueuedRequest", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "processQueuedRequests", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "stateMutability": "view", + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "newImplementation", "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "realBalanceOf", - "outputs": [ + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ] + }, + "GlobalBlacklist_Proxy": { + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "abi": [ + { + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "constructor" }, { - "inputs": [], - "name": "realTotalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "tokenAddress", + "name": "beacon", "type": "address" - }, + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [], - "name": "recoverUnderlying", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "payable", + "type": "fallback" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "GlobalOwner": { + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "abi": [ + { + "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": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "name": "repatriate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "requestWithdrawal", - "outputs": [], + "name": "Upgraded", + "type": "event" + }, + { "stateMutability": "payable", - "type": "function" + "type": "fallback" }, { - "inputs": [], - "name": "retentionRateUD7x3", - "outputs": [ + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "name": "rewardsRedirectsFromTo", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferStarted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "rewardsRedirectsToFrom", + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { "internalType": "address", @@ -22527,40 +28615,34 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "pendingOwner", + "outputs": [ { - "internalType": "uint16", - "name": "aprUD7x3", - "type": "uint16" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "setAPR", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "proxiableUUID", + "outputs": [ { - "internalType": "uint32", - "name": "feesRateUD7x3_", - "type": "uint32" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "setFeesRate", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address payable", - "name": "fund_", - "type": "address" - } - ], - "name": "setFund", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22569,11 +28651,11 @@ "inputs": [ { "internalType": "address", - "name": "ldyStakingAddress", + "name": "newOwner", "type": "address" } ], - "name": "setLDYStaking", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22581,12 +28663,12 @@ { "inputs": [ { - "internalType": "uint32", - "name": "retentionRateUD7x3_", - "type": "uint32" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "name": "setRetentionRate", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22594,169 +28676,163 @@ { "inputs": [ { - "internalType": "address payable", - "name": "withdrawer_", + "internalType": "address", + "name": "newImplementation", "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "setWithdrawer", + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "_logic", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "startRewardsRedirection", - "outputs": [], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "GlobalOwner_Implementation": { + "address": "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "abi": [ + { + "inputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "from", + "name": "previousAdmin", "type": "address" }, { + "indexed": false, "internalType": "address", - "name": "to", + "name": "newAdmin", "type": "address" } ], - "name": "stopRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { - "inputs": [], - "name": "totalQueued", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "to", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferStarted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "from", + "name": "previousOwner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "to", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "implementation", "type": "address" } ], - "name": "transferOwnership", + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "transfersListeners", + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "contract ITransfersListener", + "internalType": "address", "name": "", "type": "address" } @@ -22766,12 +28842,12 @@ }, { "inputs": [], - "name": "unclaimedFees", + "name": "pendingOwner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -22779,26 +28855,20 @@ }, { "inputs": [], - "name": "underlying", + "name": "proxiableUUID", "outputs": [ { - "internalType": "contract IERC20Upgradeable", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "listenerContract", - "type": "address" - } - ], - "name": "unlistenToTransfers", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22807,19 +28877,13 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "unmintedRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -22852,98 +28916,11 @@ "outputs": [], "stateMutability": "payable", "type": "function" - }, - { - "inputs": [], - "name": "usableUnderlyings", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "withdrawTo", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "withdrawalQueue", - "outputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint96", - "name": "amount", - "type": "uint96" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalQueueCursor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawer", - "outputs": [ - { - "internalType": "address payable", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" } ] }, - "LUSDC_Proxy": { - "address": "0x6D3D88028eBE4cab9230Ddae7717b1B40508194d", + "GlobalOwner_Proxy": { + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", "abi": [ { "inputs": [ @@ -22990,138 +28967,34 @@ "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - } - } - } - ], - "59144": [ - { - "name": "linea", - "chainId": "59144", - "contracts": { - "APRHistory": { - "address": "0x3F0Ff9947550d7Cf26549136552C785446ad4Ac5", - "abi": [ - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref1", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref2", - "type": "tuple" - } - ], - "name": "eq", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "ref", - "type": "tuple" - } - ], - "name": "incrementReference", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "packIndex", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "cursorIndex", - "type": "uint32" - } - ], - "internalType": "struct APRHistory.Reference", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "pure", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" } ] }, - "GlobalBlacklist": { - "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "GlobalPause": { + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", "abi": [ { "anonymous": false, @@ -23209,17 +29082,30 @@ "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" }, { "inputs": [], @@ -23248,19 +29134,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isBlacklisted", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -23268,12 +29148,19 @@ }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -23313,14 +29200,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -23374,8 +29255,8 @@ } ] }, - "GlobalBlacklist_Implementation": { - "address": "0x896E3B079aa7A00413c074a5C888f3b96d4d3bcA", + "GlobalPause_Implementation": { + "address": "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", "abi": [ { "inputs": [], @@ -23450,27 +29331,40 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "implementation", + "name": "account", "type": "address" } ], - "name": "Upgraded", + "name": "Paused", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" }, { "inputs": [], @@ -23499,19 +29393,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isBlacklisted", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -23519,12 +29407,19 @@ }, { "inputs": [], - "name": "owner", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -23564,14 +29459,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unBlacklist", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -23609,8 +29498,8 @@ } ] }, - "GlobalBlacklist_Proxy": { - "address": "0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350", + "GlobalPause_Proxy": { + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", "abi": [ { "inputs": [ @@ -23683,135 +29572,231 @@ } ] }, - "GlobalOwner": { - "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", + "LDY": { + "address": "0xE376Bd13399F1f86ad659145A2BED2cDC24a7E5E", "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "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": "previousAdmin", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", "type": "address" }, { - "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", - "name": "newAdmin", + "name": "account", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "account", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "indexed": false, "internalType": "uint8", - "name": "version", + "name": "", "type": "uint8" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "spender", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "OwnershipTransferStarted", - "type": "event" + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "spender", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initialize", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -23819,12 +29804,12 @@ }, { "inputs": [], - "name": "pendingOwner", + "name": "symbol", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -23832,34 +29817,38 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "totalSupply", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "to", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -23867,76 +29856,119 @@ "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "upgradeTo", - "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "LDYStaking": { + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "abi": [ { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "newImplementation", + "name": "previousAdmin", "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "AdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_logic", + "name": "beacon", "type": "address" - }, + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], + "name": "Upgraded", + "type": "event" + }, + { "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "GlobalOwner_Implementation": { - "address": "0x36811e4b6d5f890bd0ac858B69499F9a7b2dc05F", - "abi": [ + "type": "fallback" + }, { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" + "internalType": "uint256", + "name": "rewardAmount", + "type": "uint256" }, { "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "rewardPerSec", + "type": "uint256" } ], - "name": "AdminChanged", + "name": "NotifiedRewardAmount", "type": "event" }, { @@ -23945,11 +29977,17 @@ { "indexed": true, "internalType": "address", - "name": "beacon", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "name": "BeaconUpgraded", + "name": "OwnershipTransferred", "type": "event" }, { @@ -23957,12 +29995,12 @@ "inputs": [ { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "Initialized", + "name": "Paused", "type": "event" }, { @@ -23971,17 +30009,23 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "user", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "name": "OwnershipTransferStarted", + "name": "RewardPaid", "type": "event" }, { @@ -23990,17 +30034,36 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "user", "type": "address" }, { - "indexed": true, + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", + "name": "Unpaused", "type": "event" }, { @@ -24009,43 +30072,143 @@ { "indexed": true, "internalType": "address", - "name": "implementation", + "name": "user", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", + "name": "Unstaked", "type": "event" }, { - "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "initialize", + "name": "finishAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getEarnedUser", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], + "name": "getUserStakes", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "internalType": "struct LDYStaking.StakingInfo[]", + "name": "", + "type": "tuple[]" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "pendingOwner", + "name": "globalBlacklist", "outputs": [ { "internalType": "address", @@ -24058,12 +30221,12 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "globalOwner", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", @@ -24071,279 +30234,305 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "globalPause", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", + "name": "highTierAccounts", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "globalOwner_", "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "stakeRewardToken_", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "stakeDurations_", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "stakeDurationForPerks_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeAmountForPerks_", + "type": "uint256" } ], - "name": "upgradeToAndCall", + "name": "initialize", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "GlobalOwner_Proxy": { - "address": "0xe4Af4573bFc5F04D8b84c61744de8A94059f2462", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" - }, + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "stateMutability": "payable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "", "type": "address" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "GlobalPause": { - "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "proxiableUUID", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "tokenAddress", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "stateMutability": "payable", - "type": "fallback" + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "receive" + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardRatePerSec", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "duration", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "stakeDurationIndex", + "type": "uint8" } ], - "name": "Unpaused", - "type": "event" + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "globalOwner", + "name": "stakeAmountForPerks", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "stakeDurationForPerks", + "outputs": [ { - "internalType": "address", - "name": "globalOwner_", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakeDurations", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -24351,32 +30540,31 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "stakeRewardToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "proxiableUUID", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", "outputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "tier", + "type": "uint256" } ], "stateMutability": "view", @@ -24384,8 +30572,14 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, @@ -24403,8 +30597,19 @@ "type": "function" }, { - "inputs": [], - "name": "unpause", + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "unstake", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24440,6 +30645,50 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userStakingInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -24458,8 +30707,8 @@ } ] }, - "GlobalPause_Implementation": { - "address": "0xd4568D313FA2d5C6EBA37C9f30F6FB8D1C552ddd", + "LDYStaking_Implementation": { + "address": "0xFFF42672fb476afe698142A9B6211b772b89b8Ee", "abi": [ { "inputs": [], @@ -24511,6 +30760,25 @@ "name": "Initialized", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rewardAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardPerSec", + "type": "uint256" + } + ], + "name": "NotifiedRewardAmount", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -24547,13 +30815,25 @@ "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "user", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "name": "Unpaused", + "name": "RewardPaid", "type": "event" }, { @@ -24562,67 +30842,95 @@ { "indexed": true, "internalType": "address", - "name": "implementation", + "name": "user", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Upgraded", + "name": "Staked", "type": "event" }, { - "inputs": [], - "name": "globalOwner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "globalOwner_", + "name": "user", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unstaked", + "type": "event" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "implementation", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Upgraded", + "type": "event" }, { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "earned", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -24630,40 +30938,45 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "finishAt", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], + "name": "getEarnedUser", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "unpause", + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24672,176 +30985,188 @@ "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "account", "type": "address" } ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getUserStakes", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "internalType": "struct LDYStaking.StakingInfo[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "globalBlacklist", + "outputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" - } - ] - }, - "GlobalPause_Proxy": { - "address": "0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB", - "abi": [ + }, { - "inputs": [ + "inputs": [], + "name": "globalOwner", + "outputs": [ { "internalType": "address", - "name": "_logic", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "stateMutability": "payable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "globalPause", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "beacon", + "name": "", "type": "address" } ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "highTierAccounts", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" + "stateMutability": "view", + "type": "function" }, { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "LDYStaking": { - "address": "0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1", - "abi": [ - { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "globalOwner_", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "globalPause_", "type": "address" - } - ], - "name": "OwnershipTransferStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "globalBlacklist_", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "stakeRewardToken_", "type": "address" + }, + { + "internalType": "uint256[]", + "name": "stakeDurations_", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "stakeDurationForPerks_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeAmountForPerks_", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "acceptOwnership", + "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "name": "highTierAccounts", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "owner", @@ -24857,12 +31182,12 @@ }, { "inputs": [], - "name": "pendingOwner", + "name": "paused", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -24870,42 +31195,49 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "tokenAddress", "type": "address" }, { - "internalType": "bool", - "name": "status", - "type": "bool" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "setHighTierAccount", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "tierOf", + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", - "name": "tier", + "name": "", "type": "uint256" } ], @@ -24913,127 +31245,126 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "LTokenSignaler": { - "address": "0xBA427517505b14C560854aED003304Fc69cbadfb", - "abi": [ + }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, + "inputs": [], + "name": "rewardRatePerSec", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "AdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" + "internalType": "uint256", + "name": "duration", + "type": "uint256" } ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { "internalType": "uint8", - "name": "version", + "name": "stakeDurationIndex", "type": "uint8" } ], - "name": "Initialized", - "type": "event" + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "stakeAmountForPerks", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "lTokenAddress", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "LTokenSignalEvent", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeDurationForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakeDurations", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "globalOwner", + "name": "stakeRewardToken", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20Upgradeable", "name": "", "type": "address" } @@ -25045,23 +31376,16 @@ "inputs": [ { "internalType": "address", - "name": "globalOwner_", + "name": "account", "type": "address" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "tierOf", "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "tier", + "type": "uint256" } ], "stateMutability": "view", @@ -25069,48 +31393,46 @@ }, { "inputs": [], - "name": "proxiableUUID", + "name": "totalStaked", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "lTokenAddress", + "name": "newOwner", "type": "address" } ], - "name": "signalLToken", + "name": "transferOwnership", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "unstake", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -25144,6 +31466,55 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userStakingInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "LDYStaking_Proxy": { + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "abi": [ { "inputs": [ { @@ -25159,17 +31530,65 @@ ], "stateMutability": "payable", "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" } ] }, - "LTokenSignaler_Implementation": { - "address": "0xEEe2CA6f97aC13D2D0dF1a2d45fC9ec30939c331", + "LTokenSignaler": { + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, { "anonymous": false, "inputs": [ @@ -25195,13 +31614,34 @@ { "indexed": true, "internalType": "address", - "name": "beacon", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", "type": "address" } ], - "name": "BeaconUpgraded", + "name": "Upgraded", "type": "event" }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, { "anonymous": false, "inputs": [ @@ -25247,19 +31687,6 @@ "name": "OwnershipTransferred", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, { "inputs": [], "name": "globalOwner", @@ -25375,12 +31802,7 @@ "outputs": [], "stateMutability": "payable", "type": "function" - } - ] - }, - "LTokenSignaler_Proxy": { - "address": "0xBA427517505b14C560854aED003304Fc69cbadfb", - "abi": [ + }, { "inputs": [ { @@ -25396,65 +31818,17 @@ ], "stateMutability": "payable", "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": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" } ] }, - "LUSDC": { - "address": "0x4AF215DbE27fc030F37f73109B85F421FAB45B7a", + "LTokenSignaler_Implementation": { + "address": "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -25487,108 +31861,6 @@ "name": "BeaconUpgraded", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint16", - "name": "newAPRUD7x3", - "type": "uint16" - } - ], - "name": "APRChangeEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "int256", - "name": "id", - "type": "int256" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "enum LToken.Action", - "name": "action", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amountAfterFees", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum LToken.Status", - "name": "newStatus", - "type": "uint8" - } - ], - "name": "ActivityEvent", - "type": "event" - }, - { - "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": [ @@ -25607,69 +31879,12 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "balanceBefore", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "rewards", - "type": "uint256" - } - ], - "name": "MintedRewardsEvent", - "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": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTVL", - "type": "uint256" + "internalType": "address", + "name": "lTokenAddress", + "type": "address" } ], - "name": "TVLChangeEvent", + "name": "LTokenSignalEvent", "type": "event" }, { @@ -25678,434 +31893,507 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", + "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "implementation", "type": "address" } ], - "name": "Unpaused", + "name": "Upgraded", "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "globalOwner", + "outputs": [ { "internalType": "address", - "name": "owner", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "spender", + "name": "globalOwner_", "type": "address" } ], - "name": "allowance", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", + "inputs": [], + "name": "proxiableUUID", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "lTokenAddress", "type": "address" } ], - "name": "balanceOf", - "outputs": [ + "name": "signalLToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], + "name": "transferOwnership", + "outputs": [], "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "name": "cancelWithdrawalRequest", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "claimFees", + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" - }, + } + ] + }, + "LTokenSignaler_Proxy": { + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "abi": [ { - "inputs": [], - "name": "decimals", - "outputs": [ + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "payable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "decreaseAllowance", - "outputs": [ + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" } ], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" }, { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "LUSDC": { + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "abi": [ + { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "account", + "name": "previousAdmin", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" } ], - "name": "depositFor", - "outputs": [ + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "pure", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" }, { - "inputs": [], - "name": "feesRateUD7x3", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" } ], - "stateMutability": "view", - "type": "function" + "name": "APRChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "frozenRequests", - "outputs": [ + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { - "internalType": "uint96", + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", "name": "amount", - "type": "uint96" + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" } ], - "stateMutability": "view", - "type": "function" + "name": "ActivityEvent", + "type": "event" }, { - "inputs": [], - "name": "fund", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "owner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAPR", - "outputs": [ + }, { - "internalType": "uint16", - "name": "", - "type": "uint16" + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { - "inputs": [], - "name": "getExpectedRetained", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "getWithdrawnAmountAndFees", - "outputs": [ - { - "internalType": "uint256", - "name": "withdrawnAmount", + "name": "balanceBefore", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "fees", + "name": "rewards", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "MintedRewardsEvent", + "type": "event" }, { - "inputs": [], - "name": "globalBlacklist", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "globalOwner", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "globalPause", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "newTVL", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TVLChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "globalOwner_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalPause_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalBlacklist_", + "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "ldyStaking_", + "name": "to", "type": "address" }, { - "internalType": "address", - "name": "underlyingToken", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "instantWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "invested", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20Upgradeable", - "name": "", + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ldyStaking", + ], + "name": "allowance", "outputs": [ { - "internalType": "contract LDYStaking", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -26115,49 +32403,40 @@ "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "listenToTransfers", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", + "name": "approve", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "balanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -26171,26 +32450,26 @@ "type": "uint256" } ], - "name": "processBigQueuedRequest", + "name": "cancelWithdrawalRequest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "processQueuedRequests", + "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "proxiableUUID", + "name": "decimals", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint8", "name": "", - "type": "bytes32" + "type": "uint8" } ], "stateMutability": "view", @@ -26200,95 +32479,66 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" - } - ], - "name": "realBalanceOf", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "subtractedValue", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "realTotalSupply", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverUnderlying", + "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "repatriate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "depositFor", + "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "requestWithdrawal", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "retentionRateUD7x3", + "name": "feesRateUD7x3", "outputs": [ { "internalType": "uint32", @@ -26302,36 +32552,30 @@ { "inputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "name": "rewardsRedirectsFromTo", + "name": "frozenRequests", "outputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "rewardsRedirectsToFrom", + "inputs": [], + "name": "fund", "outputs": [ { "internalType": "address", @@ -26343,127 +32587,68 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getAPR", + "outputs": [ { "internalType": "uint16", - "name": "aprUD7x3", + "name": "", "type": "uint16" } ], - "name": "setAPR", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "feesRateUD7x3_", - "type": "uint32" - } - ], - "name": "setFeesRate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "fund_", - "type": "address" - } - ], - "name": "setFund", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "ldyStakingAddress", - "type": "address" - } - ], - "name": "setLDYStaking", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "retentionRateUD7x3_", - "type": "uint32" - } - ], - "name": "setRetentionRate", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ { - "internalType": "address payable", - "name": "withdrawer_", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "setWithdrawer", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "account", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "startRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, + "name": "getWithdrawnAmountAndFees", + "outputs": [ { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" } ], - "name": "stopRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "globalBlacklist", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -26471,12 +32656,12 @@ }, { "inputs": [], - "name": "totalQueued", + "name": "globalOwner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -26484,12 +32669,12 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "globalPause", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -26499,16 +32684,16 @@ "inputs": [ { "internalType": "address", - "name": "to", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "addedValue", "type": "uint256" } ], - "name": "transfer", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -26523,58 +32708,95 @@ "inputs": [ { "internalType": "address", - "name": "from", + "name": "globalOwner_", "type": "address" }, { "internalType": "address", - "name": "to", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", "type": "address" }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "transferFrom", + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "invested", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ldyStaking", + "outputs": [ { - "internalType": "address", - "name": "newOwner", + "internalType": "contract LDYStaking", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "listenerContract", + "type": "address" } ], - "name": "transfersListeners", + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "contract ITransfersListener", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -26582,12 +32804,12 @@ }, { "inputs": [], - "name": "unclaimedFees", + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -26595,12 +32817,12 @@ }, { "inputs": [], - "name": "underlying", + "name": "paused", "outputs": [ { - "internalType": "contract IERC20Upgradeable", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -26609,16 +32831,36 @@ { "inputs": [ { - "internalType": "address", - "name": "listenerContract", - "type": "address" + "internalType": "uint256", + "name": "requestId", + "type": "uint256" } ], - "name": "unlistenToTransfers", + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -26627,7 +32869,20 @@ "type": "address" } ], - "name": "unmintedRewardsOf", + "name": "realBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "realTotalSupply", "outputs": [ { "internalType": "uint256", @@ -26642,41 +32897,68 @@ "inputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "tokenAddress", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "upgradeTo", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "upgradeToAndCall", + "name": "requestWithdrawal", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "usableUnderlyings", + "name": "retentionRateUD7x3", "outputs": [ { - "internalType": "uint256", + "internalType": "uint32", "name": "", - "type": "uint256" + "type": "uint32" } ], "stateMutability": "view", @@ -26686,364 +32968,286 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "withdrawTo", + "name": "rewardsRedirectsFromTo", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, { "internalType": "uint256", "name": "", "type": "uint256" } ], - "name": "withdrawalQueue", + "name": "rewardsRedirectsToFrom", "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" - }, - { - "internalType": "uint96", - "name": "amount", - "type": "uint96" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "withdrawalQueueCursor", - "outputs": [ + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" } ], - "stateMutability": "view", + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "withdrawer", - "outputs": [ + "inputs": [ { "internalType": "address payable", - "name": "", + "name": "fund_", "type": "address" } ], - "stateMutability": "view", + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_logic", + "name": "ldyStakingAddress", "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "stateMutability": "payable", - "type": "constructor" - } - ] - }, - "LUSDC_Implementation": { - "address": "0x768fa735a0D894784fe38F52124B246dd6347D19", - "abi": [ + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint16", - "name": "newAPRUD7x3", - "type": "uint16" + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" } ], - "name": "APRChangeEvent", - "type": "event" + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "int256", - "name": "id", - "type": "int256" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", + "internalType": "address payable", + "name": "withdrawer_", "type": "address" - }, - { - "indexed": true, - "internalType": "enum LToken.Action", - "name": "action", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amountAfterFees", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum LToken.Status", - "name": "newStatus", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "int256", - "name": "newId", - "type": "int256" } ], - "name": "ActivityEvent", - "type": "event" + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "from", "type": "address" }, { - "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "to", "type": "address" } ], - "name": "AdminChanged", - "type": "event" + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "owner", + "name": "from", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "spender", + "name": "to", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "BeaconUpgraded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalQueued", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "balanceBefore", - "type": "uint256" - }, + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "rewards", + "name": "", "type": "uint256" } ], - "name": "MintedRewardsEvent", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "to", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "transfer", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "newTVL", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "TVLChangeEvent", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "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", + "name": "amount", "type": "uint256" } ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "transferFrom", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "implementation", + "name": "newOwner", "type": "address" } ], - "name": "Upgraded", - "type": "event" + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", + "outputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract ITransfersListener", + "name": "", "type": "address" } ], - "name": "allowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unclaimedFees", "outputs": [ { "internalType": "uint256", @@ -27055,26 +33259,28 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "underlying", + "outputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract IERC20Upgradeable", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "approve", - "outputs": [ + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "listenerContract", + "type": "address" } ], + "name": "unlistenToTransfers", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -27086,7 +33292,7 @@ "type": "address" } ], - "name": "balanceOf", + "name": "unmintedRewardsOf", "outputs": [ { "internalType": "uint256", @@ -27100,31 +33306,42 @@ { "inputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "newImplementation", + "type": "address" } ], - "name": "cancelWithdrawalRequest", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "claimFees", + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "usableUnderlyings", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -27134,16 +33351,16 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "account", "type": "address" }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "amount", "type": "uint256" } ], - "name": "decreaseAllowance", + "name": "withdrawTo", "outputs": [ { "internalType": "bool", @@ -27151,54 +33368,54 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "withdrawalQueue", + "outputs": [ { "internalType": "address", "name": "account", "type": "address" }, { - "internalType": "uint256", + "internalType": "uint96", "name": "amount", - "type": "uint256" + "type": "uint96" } ], - "name": "depositFor", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueueCursor", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "feesRateUD7x3", + "name": "withdrawer", "outputs": [ { - "internalType": "uint32", + "internalType": "address payable", "name": "", - "type": "uint32" + "type": "address" } ], "stateMutability": "view", @@ -27207,277 +33424,296 @@ { "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" } ], - "name": "frozenRequests", - "outputs": [ + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "LUSDC_Implementation": { + "address": "0xE0434e00f3088Ed0cE950F985f9dbe9898A18153", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" + } + ], + "name": "APRChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { - "internalType": "uint96", + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", "name": "amount", - "type": "uint96" + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" } ], - "stateMutability": "view", - "type": "function" + "name": "ActivityEvent", + "type": "event" }, { - "inputs": [], - "name": "fund", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "AdminChanged", + "type": "event" + }, + { + "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" }, { - "inputs": [], - "name": "getAPR", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint16", - "name": "", - "type": "uint16" + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "BeaconUpgraded", + "type": "event" }, { - "inputs": [], - "name": "getExpectedRetained", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" + "name": "Initialized", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "getWithdrawnAmountAndFees", - "outputs": [ - { - "internalType": "uint256", - "name": "withdrawnAmount", + "name": "balanceBefore", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "fees", + "name": "rewards", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "MintedRewardsEvent", + "type": "event" }, { - "inputs": [], - "name": "globalBlacklist", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "globalOwner", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "globalPause", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "newTVL", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TVLChangeEvent", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "globalOwner_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalPause_", - "type": "address" - }, - { - "internalType": "address", - "name": "globalBlacklist_", + "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "ldyStaking_", + "name": "to", "type": "address" }, { - "internalType": "address", - "name": "underlyingToken", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], - "name": "instantWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { - "inputs": [], - "name": "invested", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20Upgradeable", - "name": "", + "indexed": false, + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "ldyStaking", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract LDYStaking", - "name": "", + "indexed": true, + "internalType": "address", + "name": "implementation", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Upgraded", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "listenerContract", + "name": "owner", "type": "address" - } - ], - "name": "listenToTransfers", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + }, { "internalType": "address", - "name": "", + "name": "spender", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "allowance", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -27485,35 +33721,26 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "requestId", + "name": "amount", "type": "uint256" } ], - "name": "processBigQueuedRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "processQueuedRequests", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", + "name": "approve", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -27524,20 +33751,7 @@ "type": "address" } ], - "name": "realBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "realTotalSupply", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -27550,240 +33764,211 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "requestId", "type": "uint256" } ], - "name": "recoverERC20", + "name": "cancelWithdrawalRequest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "recoverUnderlying", + "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "decimals", + "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "repatriate", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "amount", + "name": "subtractedValue", "type": "uint256" } ], - "name": "requestWithdrawal", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "retentionRateUD7x3", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint32", + "internalType": "bool", "name": "", - "type": "uint32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "rewardsRedirectsFromTo", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "name": "rewardsRedirectsToFrom", + "name": "depositFor", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ { - "internalType": "uint16", - "name": "aprUD7x3", - "type": "uint16" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "setAPR", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint32", - "name": "feesRateUD7x3_", - "type": "uint32" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setFeesRate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "frozenRequests", + "outputs": [ { - "internalType": "address payable", - "name": "fund_", + "internalType": "address", + "name": "account", "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], - "name": "setFund", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "fund", + "outputs": [ { "internalType": "address", - "name": "ldyStakingAddress", + "name": "", "type": "address" } ], - "name": "setLDYStaking", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getAPR", + "outputs": [ { - "internalType": "uint32", - "name": "retentionRateUD7x3_", - "type": "uint32" + "internalType": "uint16", + "name": "", + "type": "uint16" } ], - "name": "setRetentionRate", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ { - "internalType": "address payable", - "name": "withdrawer_", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "setWithdrawer", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "account", "type": "address" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "startRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getWithdrawnAmountAndFees", + "outputs": [ { - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" }, { - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "fees", + "type": "uint256" } ], - "name": "stopRewardsRedirection", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "globalBlacklist", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -27791,12 +33976,12 @@ }, { "inputs": [], - "name": "totalQueued", + "name": "globalOwner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -27804,12 +33989,12 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "globalPause", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -27819,16 +34004,16 @@ "inputs": [ { "internalType": "address", - "name": "to", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "addedValue", "type": "uint256" } ], - "name": "transfer", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -27843,71 +34028,56 @@ "inputs": [ { "internalType": "address", - "name": "from", + "name": "globalOwner_", "type": "address" }, { "internalType": "address", - "name": "to", + "name": "globalPause_", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, { "internalType": "address", - "name": "newOwner", + "name": "underlyingToken", "type": "address" } ], - "name": "transferOwnership", + "name": "initialize", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "name": "transfersListeners", - "outputs": [ - { - "internalType": "contract ITransfersListener", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "unclaimedFees", + "name": "invested", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -27915,10 +34085,10 @@ }, { "inputs": [], - "name": "underlying", + "name": "ldyStaking", "outputs": [ { - "internalType": "contract IERC20Upgradeable", + "internalType": "contract LDYStaking", "name": "", "type": "address" } @@ -27934,69 +34104,45 @@ "type": "address" } ], - "name": "unlistenToTransfers", + "name": "listenToTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "unmintedRewardsOf", + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "newImplementation", + "name": "", "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "usableUnderlyings", + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -28004,55 +34150,46 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "requestId", "type": "uint256" } ], - "name": "withdrawTo", + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "withdrawalQueue", - "outputs": [ { "internalType": "address", "name": "account", "type": "address" - }, - { - "internalType": "uint96", - "name": "amount", - "type": "uint96" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalQueueCursor", + "name": "realBalanceOf", "outputs": [ { "internalType": "uint256", @@ -28065,224 +34202,153 @@ }, { "inputs": [], - "name": "withdrawer", + "name": "realTotalSupply", "outputs": [ { - "internalType": "address payable", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "LUSDC_Proxy": { - "address": "0x4AF215DbE27fc030F37f73109B85F421FAB45B7a", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "constructor" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "previousAdmin", + "name": "tokenAddress", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "BeaconUpgraded", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "stateMutability": "payable", - "type": "fallback" + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "PreMining": { - "address": "0xd54d564606611A3502FE8909bBD3075dbeb77813", - "abi": [ { "inputs": [ - { - "internalType": "address", - "name": "lTokenAddress_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "maxDistributedLDY_", - "type": "uint256" - }, { "internalType": "uint256", - "name": "lockedHardCap_", + "name": "amount", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "minLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "maxLockDuration_", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "vestingDuration_", - "type": "uint8" } ], + "name": "repatriate", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" - }, + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "duration", - "type": "uint8" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "Lock", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" - }, + } + ], + "name": "rewardsRedirectsFromTo", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "OwnershipTransferStarted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" }, { - "indexed": true, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ + { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" } ], - "name": "Paused", - "type": "event" + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" } ], - "name": "Unpaused", - "type": "event" - }, - { - "inputs": [], - "name": "acceptOwnership", + "name": "setFeesRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28290,77 +34356,51 @@ { "inputs": [ { - "internalType": "address", - "name": "", + "internalType": "address payable", + "name": "fund_", "type": "address" } ], - "name": "accountsLocks", - "outputs": [ - { - "internalType": "uint240", - "name": "amount", - "type": "uint240" - }, - { - "internalType": "uint8", - "name": "duration", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "hasUnlocked", - "type": "bool" - }, - { - "internalType": "uint216", - "name": "claimedRewards", - "type": "uint216" - }, - { - "internalType": "uint40", - "name": "lockEndTimestamp", - "type": "uint40" - } - ], - "stateMutability": "view", + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "account", + "name": "ldyStakingAddress", "type": "address" } ], - "name": "availableToClaim", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "claimPhaseStartTimestamp", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" } ], - "stateMutability": "view", + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "claimRewards", + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawer_", + "type": "address" + } + ], + "name": "setWithdrawer", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28369,36 +34409,46 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "from", "type": "address" - } - ], - "name": "eligibleRewardsOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "to", + "type": "address" } ], - "stateMutability": "view", + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "endDepositPhase", + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "stopRewardsRedirection", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "hasClaimPhaseStarted", + "name": "symbol", "outputs": [ { - "internalType": "bool", + "internalType": "string", "name": "", - "type": "bool" + "type": "string" } ], "stateMutability": "view", @@ -28406,12 +34456,12 @@ }, { "inputs": [], - "name": "hasDepositPhaseEnded", + "name": "totalQueued", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -28419,102 +34469,97 @@ }, { "inputs": [], - "name": "hasRecoveryPhaseStarted", + "name": "totalSupply", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "instantUnlock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lToken", - "outputs": [ + "inputs": [ { - "internalType": "contract LToken", - "name": "", + "internalType": "address", + "name": "to", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ldyToken", + "name": "transfer", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "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": "uint8", - "name": "duration", - "type": "uint8" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "lock", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "lockedHardCap", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], + "name": "transferOwnership", + "outputs": [], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "maxDistributedLDY", - "outputs": [ + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxLockDuration", + "name": "transfersListeners", "outputs": [ { - "internalType": "uint8", + "internalType": "contract ITransfersListener", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -28522,7 +34567,7 @@ }, { "inputs": [], - "name": "maxWeight", + "name": "unclaimedFees", "outputs": [ { "internalType": "uint256", @@ -28535,132 +34580,83 @@ }, { "inputs": [], - "name": "minLockDuration", + "name": "underlying", "outputs": [ { - "internalType": "uint8", + "internalType": "contract IERC20Upgradeable", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "listenerContract", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", + "name": "unlistenToTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingOwner", + "name": "unmintedRewardsOf", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "processUnlockRequests", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "tokenAddress", + "name": "newImplementation", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "requestUnlock", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "ldyTokenAddress", + "name": "newImplementation", "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "setLDYToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startClaimPhase", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "startRecoveryPhase", + "name": "upgradeToAndCall", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "totalLocked", + "name": "usableUnderlyings", "outputs": [ { "internalType": "uint256", @@ -28675,26 +34671,24 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "underlyingToken", + "name": "withdrawTo", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -28705,12 +34699,17 @@ "type": "uint256" } ], - "name": "unlockRequests", + "name": "withdrawalQueue", "outputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" } ], "stateMutability": "view", @@ -28718,7 +34717,7 @@ }, { "inputs": [], - "name": "unlockRequestsCursor", + "name": "withdrawalQueueCursor", "outputs": [ { "internalType": "uint256", @@ -28731,25 +34730,92 @@ }, { "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "vestingDuration", + "name": "withdrawer", "outputs": [ { - "internalType": "uint8", + "internalType": "address payable", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", "type": "function" } ] + }, + "LUSDC_Proxy": { + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] } } } diff --git a/contracts/foundry/test/LDY.t.sol b/contracts/foundry/test/LDY.t.sol new file mode 100644 index 00000000..f409efaf --- /dev/null +++ b/contracts/foundry/test/LDY.t.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "../lib/forge-std/src/Test.sol"; +import {LDY} from "../../src/LDY.sol"; + +contract Tests is Test { + LDY tested; + + function setUp() public { + // Deploy LDY contract + tested = new LDY(); + vm.label(address(tested), "LDY"); + } + + // =========================== + // === decimals() function === + function test_decimals_1() public { + console.log("Should return 18"); + assertEq(tested.decimals(), 18); + } + + // ======================= + // === name() function === + function test_name_1() public { + console.log("Should return 'Ledgity Token'"); + assertEq(tested.name(), "Ledgity Token"); + } + + // ========================= + // === symbol() function === + function test_symbol_1() public { + console.log("Should return 'LDY'"); + assertEq(tested.symbol(), "LDY"); + } + + // ============================== + // === totalSupply() function === + function test_totalSupply_1() public { + console.log("Should return 75,000,000 * 10 ** 18"); + assertEq(tested.totalSupply(), 75_000_000 * 10 ** 18); + } + + // ==================== + // === balanceOf() ==== + function test_balanceOf_1() public { + console.log("Should mint 75M LDY to contract deployer"); + assertEq(tested.balanceOf(address(this)), 75_000_000 * 10 ** 18); + } +} diff --git a/contracts/foundry/test/LDYStaking.t.sol b/contracts/foundry/test/LDYStaking.t.sol new file mode 100644 index 00000000..84a65cc3 --- /dev/null +++ b/contracts/foundry/test/LDYStaking.t.sol @@ -0,0 +1,494 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test, console} from "../lib/forge-std/src/Test.sol"; +import {GenericERC20} from "../../src/GenericERC20.sol"; +import {LDYStaking} from "../../src/LDYStaking.sol"; +import {GlobalOwner} from "../../src/GlobalOwner.sol"; +import {GlobalPause} from "../../src/GlobalPause.sol"; +import {GlobalBlacklist} from "../../src/GlobalBlacklist.sol"; +import {ModifiersExpectations} from "./_helpers/ModifiersExpectations.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract LDYStakingTest is Test, ModifiersExpectations { + GlobalOwner globalOwner; + GlobalPause globalPause; + GlobalBlacklist globalBlacklist; + + LDYStaking ldyStaking; + GenericERC20 ldyToken; + uint256[] public stakingDurations; + uint256 public constant oneMonth = 31 * 24 * 60 * 60; + uint256 public initRewardsDuration = 12 * oneMonth; + + function setUp() public { + // Deploy GlobalOwner + GlobalOwner impl = new GlobalOwner(); + ERC1967Proxy proxy = new ERC1967Proxy(address(impl), ""); + globalOwner = GlobalOwner(address(proxy)); + globalOwner.initialize(); + vm.label(address(globalOwner), "GlobalOwner"); + + // Deploy GlobalPause + GlobalPause impl2 = new GlobalPause(); + ERC1967Proxy proxy2 = new ERC1967Proxy(address(impl2), ""); + globalPause = GlobalPause(address(proxy2)); + globalPause.initialize(address(globalOwner)); + vm.label(address(globalPause), "GlobalPause"); + + // Deploy GlobalBlacklist + GlobalBlacklist impl3 = new GlobalBlacklist(); + ERC1967Proxy proxy3 = new ERC1967Proxy(address(impl3), ""); + globalBlacklist = GlobalBlacklist(address(proxy3)); + globalBlacklist.initialize(address(globalOwner)); + vm.label(address(globalBlacklist), "GlobalBlacklist"); + + ldyToken = new GenericERC20("Ledgity Token", "LDY", 18); + vm.label(address(ldyToken), "LDY token"); + + stakingDurations = [ + 1 * oneMonth, + 6 * oneMonth, + 12 * oneMonth, + 24 * oneMonth, + 36 * oneMonth + ]; + // Deploy LDYStaking + LDYStaking impl4 = new LDYStaking(); + ERC1967Proxy proxy4 = new ERC1967Proxy(address(impl4), ""); + ldyStaking = LDYStaking(address(proxy4)); + ldyStaking.initialize( + address(globalOwner), + address(globalPause), + address(globalBlacklist), + address(ldyToken), + stakingDurations, + 12 * oneMonth, + 1000 * 1e18 + ); + + // Set initial rewards amount and duration + ldyStaking.setRewardsDuration(initRewardsDuration); + + uint256 rewardsAmount = 1_000_000e18; + deal(address(ldyToken), address(this), rewardsAmount); + assertEq(ldyToken.balanceOf(address(this)), rewardsAmount); + ldyToken.approve(address(ldyStaking), rewardsAmount); + ldyStaking.notifyRewardAmount(rewardsAmount); + } + + function test_initialize_1() public { + console.log("Shouldn't be re-initializable"); + vm.expectRevert(bytes("Initializable: contract is already initialized")); + ldyStaking.initialize( + address(globalOwner), + address(globalPause), + address(globalBlacklist), + address(ldyToken), + stakingDurations, + 12 * oneMonth, + 1000 * 1e18 + ); + } + + function test_initialize_2() public { + console.log("Should properly set global owner, pause, blacklist and ldy token"); + assertEq(ldyStaking.globalOwner(), address(globalOwner)); + assertEq(ldyStaking.globalPause(), address(globalPause)); + assertEq(ldyStaking.globalBlacklist(), address(globalBlacklist)); + assertEq(address(ldyStaking.stakeRewardToken()), address(ldyToken)); + } + + function test_paused() public { + console.log("Should return state of the global pause contract"); + assertEq(ldyStaking.paused(), false); + + globalPause.pause(); + assertEq(ldyStaking.paused(), true); + + // reverts staking in case of paused status + vm.expectRevert("Pausable: paused"); + ldyStaking.stake(1, 0); + + globalPause.unpause(); + assertEq(ldyStaking.paused(), false); + } + + function test_StakeFailed() public { + vm.expectRevert("amount = 0"); + ldyStaking.stake(0, 0); + + vm.expectRevert("invalid staking period"); + ldyStaking.stake(1, uint8(stakingDurations.length)); + + vm.expectRevert("ERC20: insufficient allowance"); + ldyStaking.stake(1, 0); + } + + function testFuzz_Stake_LessThanAmountForPerks( + address account, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + amount = bound(amount, 1, ldyStaking.stakeAmountForPerks() - 1); + + // deposit ldy token into the account + deal(address(ldyToken), account, amount); + + // stake ldy token into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + assertEq(ldyStaking.tierOf(account), 0); + } + + function testFuzz_Stake_LessThanDurationForPerks( + address account, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, 1)); + amount = bound( + amount, + ldyStaking.stakeAmountForPerks(), + 10_000_000 * 10 ** ldyToken.decimals() + ); + + // deposit ldy token into the account + deal(address(ldyToken), account, amount); + + // stake ldy token into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + assertEq(ldyStaking.tierOf(account), 0); + } + + function testFuzz_Stake_ElligibleForPerks( + address account, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 2, stakingDurations.length - 1)); + amount = bound( + amount, + ldyStaking.stakeAmountForPerks(), + 10_000_000 * 10 ** ldyToken.decimals() + ); + + // deposit ldy token into the account + deal(address(ldyToken), account, amount); + + // stake ldy token into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + assertEq(ldyStaking.tierOf(account), 3); + } + + function testFuzz_StakeToken( + address account1, + address account2, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + vm.assume(account1 != address(0)); + vm.assume(account1 != address(ldyToken)); + vm.assume(account1 != address(ldyStaking)); + vm.assume(account2 != address(0)); + vm.assume(account2 != address(ldyToken)); + vm.assume(account2 != address(ldyStaking)); + vm.assume(amount != 0); + + // deposit ldy token into the account + amount = bound(amount, 1, 1_000_000 * 10 ** ldyToken.decimals()); + deal(address(ldyToken), account1, amount); + deal(address(ldyToken), account2, amount); + + // account1 stakes ldy into the ldyStaking contract first time + vm.startPrank(account1); + ldyToken.approve(address(ldyStaking), amount); + // vm.expectEmit(address(ldyStaking)); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + assertEq(ldyStaking.totalStaked(), amount); + + // account1 stakes ldy into the ldyStaking contract again + deal(address(ldyToken), account1, amount); + vm.startPrank(account1); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + assertEq(ldyStaking.totalStaked(), amount * 2); + + LDYStaking.StakingInfo[] memory account1StakingPools = ldyStaking.getUserStakes(account1); + assertEq(account1StakingPools.length, 2); + + // account2 stakes ldy into the ldyStaking contract + vm.startPrank(account2); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + assertEq(ldyStaking.totalStaked(), amount * 3); + + LDYStaking.StakingInfo[] memory account2StakingPools = ldyStaking.getUserStakes(account2); + assertEq(account2StakingPools.length, 1); + } + + function testFuzz_UnstakeFailed_1(uint256 amount, uint256 stakeIndex) public { + vm.assume(amount == 0); + vm.expectRevert("amount = 0"); + ldyStaking.unstake(amount, stakeIndex); + } + + function testFuzz_UnstakeFailed_2( + address account, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + vm.assume(amount != 0); + vm.assume(account != address(0)); + vm.assume(account != address(ldyStaking)); + vm.assume(account != address(ldyToken)); + vm.assume(amount != 0); + amount = bound(amount, 1, 1_000_000 * 10 ** ldyToken.decimals()); + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + deal(address(ldyToken), account, amount); + + // stake + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + // unstake fail + vm.expectRevert("not allowed unstaking in the staking period"); + vm.prank(account); + ldyStaking.unstake(amount, 0); + + uint256 skipDuration = stakingDurations[stakingPeriodIndex]; + skip(skipDuration); + + vm.expectRevert("insufficient amount"); + vm.prank(account); + ldyStaking.unstake(amount + 1, 0); + + vm.expectRevert("invalid stakeIndex"); + vm.prank(account); + ldyStaking.unstake(amount + 1, 100); + } + + function testFuzz_Unstake_1( + address account1, + uint256 amount1, + uint256 amount2, + uint8 stakingPeriodIndex1, + uint8 stakingPeriodIndex2 + ) public { + vm.assume(account1 != address(0)); + vm.assume(account1 != address(ldyToken)); + vm.assume(account1 != address(ldyStaking)); + vm.assume(amount1 != 0); + vm.assume(amount2 != 0); + + amount1 = bound(amount1, 1, 1_000_000 * 10 ** ldyToken.decimals()); + amount2 = bound(amount1, 1, 1_000_000 * 10 ** ldyToken.decimals()); + stakingPeriodIndex1 = uint8(bound(stakingPeriodIndex1, 0, stakingDurations.length - 1)); + stakingPeriodIndex2 = uint8(bound(stakingPeriodIndex2, 0, stakingDurations.length - 1)); + deal(address(ldyToken), account1, amount1 + amount2); + + // account1 stakes ldy into the ldyStaking contract first time + vm.startPrank(account1); + ldyToken.approve(address(ldyStaking), amount1 + amount2); + ldyStaking.stake(amount1, stakingPeriodIndex1); + + // account1 stakes ldy into the ldyStaking contract again + ldyStaking.stake(amount2, stakingPeriodIndex2); + vm.stopPrank(); + + // check the lenght of earnedArray + uint256[] memory earnedArray = ldyStaking.getEarnedUser(account1); + assertEq(earnedArray.length, 2); + + // account1 unstakes token from staking pool 1 + uint256 skipDuration1 = stakingDurations[stakingPeriodIndex1]; + skip(skipDuration1); + vm.startPrank(account1); + uint256 earned1 = ldyStaking.earned(account1, 0); + ldyStaking.unstake(amount1, 0); + vm.stopPrank(); + assertEq(ldyToken.balanceOf(account1), amount1 + earned1); + + // check the lenght of earnedArray + earnedArray = ldyStaking.getEarnedUser(account1); + assertEq(earnedArray.length, 1); + + // account1 unstakes token from staking pool 2 + uint256 skipDuration2 = stakingDurations[stakingPeriodIndex2]; + skip(skipDuration2); + vm.startPrank(account1); + uint256 earned2 = ldyStaking.earned(account1, 0); + ldyStaking.unstake(amount2, 0); + vm.stopPrank(); + assertEq(ldyToken.balanceOf(account1), amount1 + earned1 + amount2 + earned2); + + // check the lenght of earnedArray + earnedArray = ldyStaking.getEarnedUser(account1); + assertEq(earnedArray.length, 0); + } + + function testFuzz_Unstake_2(address account, uint256 amount, uint8 stakingPeriodIndex) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + amount = bound(amount, 100, 1_000_000 * 10 ** ldyToken.decimals()); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + deal(address(ldyToken), account, amount); + + // account stakes ldy into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + // account unstakes part of token + uint256 skipDuration = stakingDurations[stakingPeriodIndex]; + uint256 partAmount = bound(amount, 1, amount - 1); + skip(skipDuration); + vm.startPrank(account); + ldyStaking.unstake(partAmount, 0); + vm.stopPrank(); + assertEq(ldyToken.balanceOf(account), partAmount); + + // check the lenght of earnedArray + uint256[] memory earnedArray = ldyStaking.getEarnedUser(account); + assertEq(earnedArray.length, 1); + + // account unstakes rest of token after 100 secs + uint256 restAmount = amount - partAmount; + skip(100); + vm.startPrank(account); + uint256 earned = ldyStaking.earned(account, 0); + assertGt(earned, 0); + ldyStaking.unstake(restAmount, 0); + vm.stopPrank(); + assertEq(ldyToken.balanceOf(account), amount + earned); + + // check the lenght of earnedArray + earnedArray = ldyStaking.getEarnedUser(account); + assertEq(earnedArray.length, 0); + } + + function testFuzz_GetReward_Failed( + address account, + uint256 amount, + uint8 stakingPeriodIndex + ) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + amount = bound(amount, 100, 1_000_000 * 10 ** ldyToken.decimals()); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + deal(address(ldyToken), account, amount); + + // account stakes ldy into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + vm.expectRevert("invalid stakeIndex"); + vm.prank(account); + ldyStaking.getReward(100); + } + + function testFuzz_GetReward(address account, uint256 amount, uint8 stakingPeriodIndex) public { + vm.assume(account != address(0)); + vm.assume(account != address(ldyToken)); + vm.assume(account != address(ldyStaking)); + vm.assume(amount != 0); + + amount = bound(amount, 100, 1_000_000 * 10 ** ldyToken.decimals()); + + stakingPeriodIndex = uint8(bound(stakingPeriodIndex, 0, stakingDurations.length - 1)); + deal(address(ldyToken), account, amount); + + // account stakes ldy into the ldyStaking contract + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), amount); + ldyStaking.stake(amount, stakingPeriodIndex); + vm.stopPrank(); + + // get rewards + vm.prank(account); + ldyStaking.getReward(0); + uint256 rewards0 = ldyToken.balanceOf(account); + assertEq(rewards0, 0); + + skip(100); + vm.prank(account); + ldyStaking.getReward(0); + uint256 rewards1 = ldyToken.balanceOf(account); + assertGt(rewards1, 0); + } + + function test_SetRewardsDurationByOwner() public { + address nonOwner = address(1234); + expectRevertOnlyOwner(); + vm.prank(nonOwner); + ldyStaking.setRewardsDuration(123); + + skip(oneMonth); + + uint256 newRewardsDuration = 6 * oneMonth; + vm.expectRevert("reward duration is not finished"); + ldyStaking.setRewardsDuration(newRewardsDuration); + + skip(initRewardsDuration); + ldyStaking.setRewardsDuration(newRewardsDuration); + } + + function test_NotifyRewardAmountByOwner() public { + address nonOwner = address(1234); + expectRevertOnlyOwner(); + vm.prank(nonOwner); + ldyStaking.notifyRewardAmount(123); + + vm.expectRevert("amount = 0"); + ldyStaking.notifyRewardAmount(0); + + uint256 rewardsAmount = 1_000_000e18; + deal(address(ldyToken), address(this), rewardsAmount); + ldyToken.approve(address(ldyStaking), rewardsAmount); + ldyStaking.notifyRewardAmount(rewardsAmount); + } +} diff --git a/contracts/foundry/test/LToken.t.sol b/contracts/foundry/test/LToken.t.sol index d3eed332..39ebe881 100644 --- a/contracts/foundry/test/LToken.t.sol +++ b/contracts/foundry/test/LToken.t.sol @@ -10,7 +10,7 @@ import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.s import {LToken} from "../../src/LToken.sol"; -import {LDYStaking} from "../../src/DummyLDYStaking.sol"; +import {LDYStaking} from "../../src/LDYStaking.sol"; import {GlobalOwner} from "../../src/GlobalOwner.sol"; import {GlobalPause} from "../../src/GlobalPause.sol"; import {GlobalBlacklist} from "../../src/GlobalBlacklist.sol"; @@ -147,6 +147,8 @@ contract Tests is Test, ModifiersExpectations { address payable withdrawerWallet = payable(address(bytes20("withdrawerWallet"))); address payable fundWallet = payable(address(bytes20("fundWallet"))); + uint256[] stakingDurations; + function setUp() public { // Deploy GlobalOwner GlobalOwner impl = new GlobalOwner(); @@ -173,8 +175,27 @@ contract Tests is Test, ModifiersExpectations { ldyToken = new GenericERC20("Ledgity Token", "LDY", 18); vm.label(address(ldyToken), "LDY token"); - // Deploy dummy LDYStaking - ldyStaking = new LDYStaking(); + uint256 oneMonth = 31 * 24 * 60 * 60; + stakingDurations = [ + 1 * oneMonth, + 6 * oneMonth, + 12 * oneMonth, + 24 * oneMonth, + 36 * oneMonth + ]; + // Deploy LDYStaking + LDYStaking impl4 = new LDYStaking(); + ERC1967Proxy proxy4 = new ERC1967Proxy(address(impl4), ""); + ldyStaking = LDYStaking(address(proxy4)); + ldyStaking.initialize( + address(globalOwner), + address(globalPause), + address(globalBlacklist), + address(ldyToken), + stakingDurations, + 12 * oneMonth, + 1000 * 1e18 + ); // Deploy GenericERC20 (the underlying token) underlyingToken = new GenericERC20("Dummy USD", "DUSD", 18); @@ -1649,6 +1670,7 @@ contract Tests is Test, ModifiersExpectations { // Ensure account is not the zero address nor the the underlying token contract vm.assume(account != address(0)); vm.assume(account != address(underlyingToken)); + vm.assume(account != address(ldyToken)); // Set first random APR on L-Token contract tested.setAPR(aprUD7x3); @@ -1663,20 +1685,19 @@ contract Tests is Test, ModifiersExpectations { tested.setFeesRate(feesRateUD7x3); // Cap tier2Amount to 100T - tier2Amount = uint216(bound(tier2Amount, 1, 100_000_000_000_000 * 10 ** decimals)); + tier2Amount = uint216( + bound(tier2Amount, 1000, 100_000_000_000_000 * 10 ** ldyToken.decimals()) + ); // Set random tier 2 amount // ldyStaking.setTier(2, tier2Amount); - // // Deposit enough $LDY tokens to be eligible to tier 2 - // deal(address(ldyToken), account, tier2Amount, true); - // vm.startPrank(account); - // ldyToken.approve(address(ldyStaking), tier2Amount); - // ldyStaking.stake(tier2Amount); - // vm.stopPrank(); - - // Add address to dummy LDYStaking high tier addresses - ldyStaking.setHighTierAccount(account, true); + // Deposit enough $LDY tokens to be eligible to tier 2 + deal(address(ldyToken), account, tier2Amount, true); + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), tier2Amount); + ldyStaking.stake(tier2Amount, 2); // minimal 1000 tokens with 12 months stakng duration + vm.stopPrank(); // Get withdraw amount and fees (uint256 withdrawnAmount, uint256 fees) = tested.getWithdrawnAmountAndFees(account, amount); @@ -1914,19 +1935,19 @@ contract Tests is Test, ModifiersExpectations { tested.tool_rawSetTotalQueued(queuedAmount); // Cap tier2Amount to 100T - tier2Amount = uint216(bound(tier2Amount, 1, 100_000_000_000_000 * 10 ** decimals)); + tier2Amount = uint216( + bound(tier2Amount, 1000, 100_000_000_000_000 * 10 ** ldyToken.decimals()) + ); // // Set random tier 2 amount // ldyStaking.setTier(2, tier2Amount); - // // Deposit enough $LDY tokens to be eligible to tier 2 - // deal(address(ldyToken), account, tier2Amount, true); - // vm.startPrank(account); - // ldyToken.approve(address(ldyStaking), tier2Amount); - // ldyStaking.stake(tier2Amount); - - // Add address to dummy LDYStaking high tier addresses - ldyStaking.setHighTierAccount(account, true); + // Deposit enough $LDY tokens to be eligible to tier 2 + deal(address(ldyToken), account, tier2Amount, true); + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), tier2Amount); + ldyStaking.stake(tier2Amount, 2); // minimal 1000 tokens with 12 months stakng duration + vm.stopPrank(); // Assert account is eligible to tier 2 assertGe(ldyStaking.tierOf(account), 2); @@ -2056,19 +2077,17 @@ contract Tests is Test, ModifiersExpectations { tested.tool_rawSetTotalQueued(queuedAmount); // Cap tier2Amount to 100T - tier2Amount = uint216(bound(tier2Amount, 1, 100_000_000_000_000 * 10 ** decimals)); + tier2Amount = uint216(bound(tier2Amount, 1000, 100_000_000_000_000 * 10 ** decimals)); // // Set random tier 2 amount // ldyStaking.setTier(2, tier2Amount); - // // Deposit enough $LDY tokens to be eligible to tier 2 - // deal(address(ldyToken), account, tier2Amount, true); - // vm.startPrank(account); - // ldyToken.approve(address(ldyStaking), tier2Amount); - // ldyStaking.stake(tier2Amount); - - // Add address to dummy LDYStaking high tier addresses - ldyStaking.setHighTierAccount(account, true); + // Deposit enough $LDY tokens to be eligible to tier 2 + deal(address(ldyToken), account, tier2Amount, true); + vm.startPrank(account); + ldyToken.approve(address(ldyStaking), tier2Amount); + ldyStaking.stake(tier2Amount, 2); // minimal 1000 tokens with 12 months stakng duration + vm.stopPrank(); // Assert account is eligible to tier 2 assertGe(ldyStaking.tierOf(account), 2); @@ -4154,8 +4173,15 @@ contract Tests is Test, ModifiersExpectations { tested.requestWithdrawal{value: processingFees}(requestedAmount1); vm.stopPrank(); - // Add address to dummy LDYStaking high tier addresses - ldyStaking.setHighTierAccount(account2, true); + // Set tier2Amount + uint256 tier2Amount = 1000 * 10 ** ldyToken.decimals(); + + // Deposit enough $LDY tokens to be eligible to tier 2 + deal(address(ldyToken), account2, tier2Amount, true); + vm.startPrank(account2); + ldyToken.approve(address(ldyStaking), tier2Amount); + ldyStaking.stake(tier2Amount, 2); // minimal 1000 tokens with 12 months stakng duration + vm.stopPrank(); // Assert account is eligible to tier 2 assertGe(ldyStaking.tierOf(account2), 2); diff --git a/contracts/foundry/test/PreMining.t.sol b/contracts/foundry/test/PreMining.t.sol index 62eadec9..d8557d72 100644 --- a/contracts/foundry/test/PreMining.t.sol +++ b/contracts/foundry/test/PreMining.t.sol @@ -9,7 +9,7 @@ import {GlobalOwner} from "../../src/GlobalOwner.sol"; import {GlobalPause} from "../../src/GlobalPause.sol"; import {GlobalBlacklist} from "../../src/GlobalBlacklist.sol"; import {GenericERC20} from "../../src/GenericERC20.sol"; -import {LDYStaking} from "../../src/DummyLDYStaking.sol"; +import {LDYStaking} from "../../src/LDYStaking.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {ModifiersExpectations} from "./_helpers/ModifiersExpectations.sol"; @@ -43,6 +43,8 @@ contract Tests is Test, ModifiersExpectations { address payable withdrawerWallet = payable(address(bytes20("withdrawerWallet"))); address payable fundWallet = payable(address(bytes20("fundWallet"))); + uint256[] public stakingDurations; + function setUp() public { // Deploy GenericERC20 (the $LDY token) ldyToken = new GenericERC20("Ledgity Token", "LDY", 18); @@ -73,8 +75,27 @@ contract Tests is Test, ModifiersExpectations { globalBlacklist.initialize(address(globalOwner)); vm.label(address(globalBlacklist), "GlobalBlacklist"); - // Deploy dummy LDYStaking contract - ldyStaking = new LDYStaking(); + uint256 oneMonth = 31 * 24 * 60 * 60; + stakingDurations = [ + 1 * oneMonth, + 6 * oneMonth, + 12 * oneMonth, + 24 * oneMonth, + 36 * oneMonth + ]; + // Deploy LDYStaking + LDYStaking impl4 = new LDYStaking(); + ERC1967Proxy proxy4 = new ERC1967Proxy(address(impl4), ""); + ldyStaking = LDYStaking(address(proxy4)); + ldyStaking.initialize( + address(globalOwner), + address(globalPause), + address(globalBlacklist), + address(ldyToken), + stakingDurations, + 12 * oneMonth, + 1000 * 1e18 + ); // Deploy the L-Token contract TestedLToken impl5 = new TestedLToken(); @@ -108,7 +129,13 @@ contract Tests is Test, ModifiersExpectations { // Set the lockdrop contract as high tier account in LDYStaking contract // This prevents it from having to pay for withdrawal fees - ldyStaking.setHighTierAccount(address(tested), true); + uint256 tier2Amount = 1000 * 10 ** ldyToken.decimals(); + // Deposit enough $LDY tokens to be eligible to tier 2 + deal(address(ldyToken), address(tested), tier2Amount, true); + vm.startPrank(address(tested)); + ldyToken.approve(address(ldyStaking), tier2Amount); + ldyStaking.stake(tier2Amount, 2); // minimal 1000 tokens with 12 months stakng duration + vm.stopPrank(); } // ============================== diff --git a/contracts/hardhat/deploy/05-LDYStaking.cts b/contracts/hardhat/deploy/05-LDY.cts similarity index 55% rename from contracts/hardhat/deploy/05-LDYStaking.cts rename to contracts/hardhat/deploy/05-LDY.cts index f6ff497c..633fd42b 100644 --- a/contracts/hardhat/deploy/05-LDYStaking.cts +++ b/contracts/hardhat/deploy/05-LDY.cts @@ -4,13 +4,10 @@ module.exports = (async ({ getNamedAccounts, deployments, getChainId }) => { const { deployer } = await getNamedAccounts(); const chainId = await getChainId(); - // IMPORTANT: As $LDY token is not available yet, we deploy here a dummy - // version of the contract so the LToken contract can work properly.It will - // be replaced by the real one once the $LDY token is deployed. - await deployments.deploy("LDYStaking", { + await deployments.deploy("LDY", { from: deployer, + contract: "LDY", log: true, - args: [], waitConfirmations: chainId == "31337" ? 1 : 2, }); }) as DeployFunction; diff --git a/contracts/hardhat/deploy/06-LDYStaking.cts b/contracts/hardhat/deploy/06-LDYStaking.cts new file mode 100644 index 00000000..dece0404 --- /dev/null +++ b/contracts/hardhat/deploy/06-LDYStaking.cts @@ -0,0 +1,49 @@ +import { type DeployFunction } from "hardhat-deploy/dist/types"; +import { parseUnits } from "viem"; + +module.exports = (async ({ getNamedAccounts, deployments, getChainId }) => { + const { deployer } = await getNamedAccounts(); + const chainId = await getChainId(); + + // Retrieve LDY contract + const ldyToken = await deployments.get("LDY"); + + // Retrieve global contracts + const globalOwner = await deployments.get("GlobalOwner"); + const globalPause = await deployments.get("GlobalPause"); + const globalBlacklist = await deployments.get("GlobalBlacklist"); + + const ONE_MONTH = 31 * 24 * 60 * 60; + const stakingDurations = [ + 1 * ONE_MONTH, // 1 month + 6 * ONE_MONTH, // 6 months + 12 * ONE_MONTH, // 12 months + 24 * ONE_MONTH, // 24 months + 36 * ONE_MONTH, // 36 months + ]; + const stakeDurationForPerks = 12 * ONE_MONTH; + const stakeAmountForPerks = parseUnits("1000", 18); + + await deployments.deploy("LDYStaking", { + from: deployer, + log: true, + proxy: { + proxyContract: "UUPS", + execute: { + init: { + methodName: "initialize", + args: [ + globalOwner.address, + globalPause.address, + globalBlacklist.address, + ldyToken.address, + stakingDurations, + stakeDurationForPerks, + stakeAmountForPerks, + ], + }, + }, + }, + waitConfirmations: chainId == "31337" ? 1 : 2, + }); +}) as DeployFunction; diff --git a/contracts/hardhat/deploy/06-LUSDC.cts b/contracts/hardhat/deploy/07-LUSDC.cts similarity index 100% rename from contracts/hardhat/deploy/06-LUSDC.cts rename to contracts/hardhat/deploy/07-LUSDC.cts diff --git a/contracts/hardhat/deploy/07-LTokenSignaler.cts b/contracts/hardhat/deploy/08-LTokenSignaler.cts similarity index 100% rename from contracts/hardhat/deploy/07-LTokenSignaler.cts rename to contracts/hardhat/deploy/08-LTokenSignaler.cts diff --git a/contracts/hardhat/deployments/baseSepolia/.chainId b/contracts/hardhat/deployments/baseSepolia/.chainId new file mode 100644 index 00000000..667f99da --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/.chainId @@ -0,0 +1 @@ +84532 \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/APRHistory.json b/contracts/hardhat/deployments/baseSepolia/APRHistory.json new file mode 100644 index 00000000..8ea4ae68 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/APRHistory.json @@ -0,0 +1,205 @@ +{ + "address": "0x9b508ABEbB61a0C24d28A728BB45834e440e4761", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref2", + "type": "tuple" + } + ], + "name": "eq", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "ref", + "type": "tuple" + } + ], + "name": "incrementReference", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "packIndex", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "cursorIndex", + "type": "uint32" + } + ], + "internalType": "struct APRHistory.Reference", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0xb4110b3d892b0ae52e185893472e5f0c8c8e09e3c10c3a4a50e9b70da255d9ff", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x9b508ABEbB61a0C24d28A728BB45834e440e4761", + "transactionIndex": 4, + "gasUsed": "745793", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7b62f038483bf090399a017fb4c1f8de79081cb9e3750b80d32da4487230a423", + "transactionHash": "0xb4110b3d892b0ae52e185893472e5f0c8c8e09e3c10c3a4a50e9b70da255d9ff", + "logs": [], + "blockNumber": 9269436, + "cumulativeGasUsed": "2284981", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref2\",\"type\":\"tuple\"}],\"name\":\"eq\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref\",\"type\":\"tuple\"}],\"name\":\"incrementReference\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Intuition: Each checkpoint in an APR history consists of two data: - the creation timestamp - the APR at that time Given that reading and writing to storage slots are among the most costly operations in Solidity, this library provides a way to store those data in a way that minimizes the number of used storage slots. Instead of storing each checkpoint in a separate storage slot, this library facilitates the packing of up to 4 checkpoints in a single storage slot.Definitions: - Checkpoint: A record of an APR change - Pack: A collection of 4 checkpoints stored in a single storage slot - History: A dynamic array of packs - Reference: A storage pointer to a checkpoint in the APR history - CheckpointData: An in-memory representation of a checkpoint dataValue limitation: This library can accommodate APRs only up to 65.536%. This is however sufficient for APR in LToken contract, which is expected to remain below 10%.For further details, see \\\"APRHistory\\\" section of whitepaper.\",\"kind\":\"dev\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"params\":{\"ref1\":\"The first reference to compare.\",\"ref2\":\"The second reference to compare.\"},\"returns\":{\"_0\":\"Whether the two references points to the same checkpoint.\"}},\"getAPR(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history array to read APR from.\"},\"returns\":{\"_0\":\"The latest checkpoint's APR.\"}},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference of the checkpoint data to extract.\",\"self\":\"The APR history to extract the checkpoint from.\"},\"returns\":{\"_0\":\"The extracted checkpoint's data.\"}},\"getLatestReference(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history to extract the reference from.\"},\"returns\":{\"_0\":\"The reference of the latest checkpoint.\"}},\"incrementReference(APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference to be incremented.\"},\"returns\":{\"_0\":\"The incremented reference.\"}},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\",\"self\":\"The array of packs to write the new checkpoint to.\"}}},\"title\":\"APRHistory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"notice\":\"Compares two checkpoints references.\"},\"getAPR(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the APR of the latest checkpoint written in the APR history.\"},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"notice\":\"Extracts checkpoint data from a given reference and in APR history.\"},\"getLatestReference(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the reference to the most recently added checkpoint in the APR history.\"},\"incrementReference(APRHistory.Reference)\":{\"notice\":\"Returns the reference of the checkpoint that should come right after the referenced checkpoint in the APR history.\"},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"notice\":\"Write a new APR checkpoint at the end of the given history array.\"}},\"notice\":\"This library offers utilities to efficiently maintain the history of an on-chain APR (Annual Percentage Rate) state. Each entry in this history is called a \\\"checkpoint\\\".\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/libs/APRHistory.sol\":\"APRHistory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x610c8561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea264697066735822122037273d18074a95e25b4ee897634daa0209a4e04e6077ddaa99b1038cb31b2bc164736f6c63430008120033", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea264697066735822122037273d18074a95e25b4ee897634daa0209a4e04e6077ddaa99b1038cb31b2bc164736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Intuition: Each checkpoint in an APR history consists of two data: - the creation timestamp - the APR at that time Given that reading and writing to storage slots are among the most costly operations in Solidity, this library provides a way to store those data in a way that minimizes the number of used storage slots. Instead of storing each checkpoint in a separate storage slot, this library facilitates the packing of up to 4 checkpoints in a single storage slot.Definitions: - Checkpoint: A record of an APR change - Pack: A collection of 4 checkpoints stored in a single storage slot - History: A dynamic array of packs - Reference: A storage pointer to a checkpoint in the APR history - CheckpointData: An in-memory representation of a checkpoint dataValue limitation: This library can accommodate APRs only up to 65.536%. This is however sufficient for APR in LToken contract, which is expected to remain below 10%.For further details, see \"APRHistory\" section of whitepaper.", + "kind": "dev", + "methods": { + "eq(APRHistory.Reference,APRHistory.Reference)": { + "params": { + "ref1": "The first reference to compare.", + "ref2": "The second reference to compare." + }, + "returns": { + "_0": "Whether the two references points to the same checkpoint." + } + }, + "getAPR(APRHistory.Pack[] storage)": { + "params": { + "self": "The history array to read APR from." + }, + "returns": { + "_0": "The latest checkpoint's APR." + } + }, + "getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)": { + "params": { + "ref": "The reference of the checkpoint data to extract.", + "self": "The APR history to extract the checkpoint from." + }, + "returns": { + "_0": "The extracted checkpoint's data." + } + }, + "getLatestReference(APRHistory.Pack[] storage)": { + "params": { + "self": "The history to extract the reference from." + }, + "returns": { + "_0": "The reference of the latest checkpoint." + } + }, + "incrementReference(APRHistory.Reference)": { + "params": { + "ref": "The reference to be incremented." + }, + "returns": { + "_0": "The incremented reference." + } + }, + "setAPR(APRHistory.Pack[] storage,uint16)": { + "params": { + "aprUD7x3": "The new APR in UD7x3 format.", + "self": "The array of packs to write the new checkpoint to." + } + } + }, + "title": "APRHistory", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "eq(APRHistory.Reference,APRHistory.Reference)": { + "notice": "Compares two checkpoints references." + }, + "getAPR(APRHistory.Pack[] storage)": { + "notice": "Retrieves the APR of the latest checkpoint written in the APR history." + }, + "getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)": { + "notice": "Extracts checkpoint data from a given reference and in APR history." + }, + "getLatestReference(APRHistory.Pack[] storage)": { + "notice": "Retrieves the reference to the most recently added checkpoint in the APR history." + }, + "incrementReference(APRHistory.Reference)": { + "notice": "Returns the reference of the checkpoint that should come right after the referenced checkpoint in the APR history." + }, + "setAPR(APRHistory.Pack[] storage,uint16)": { + "notice": "Write a new APR checkpoint at the end of the given history array." + } + }, + "notice": "This library offers utilities to efficiently maintain the history of an on-chain APR (Annual Percentage Rate) state. Each entry in this history is called a \"checkpoint\".", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist.json b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist.json new file mode 100644 index 00000000..6a453ee1 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist.json @@ -0,0 +1,357 @@ +{ + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "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": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unblacklisted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", + "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": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "transactionIndex": 3, + "gasUsed": "332581", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000800000000000000000000000000000000000080000000000000080000000000000004000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000200000000000000020000000000000000000000000000000000000000000000000000000", + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58", + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "logs": [ + { + "transactionIndex": 3, + "blockNumber": 9269431, + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000003860d3642e0e6ee4f8af53b39777417eb697b1ec" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58" + }, + { + "transactionIndex": 3, + "blockNumber": 9269431, + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58" + } + ], + "blockNumber": 9269431, + "cumulativeGasUsed": "823091", + "status": 1, + "byzantium": true + }, + "args": [ + "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [ + "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2" + ] + }, + "implementation": "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Implementation.json b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Implementation.json new file mode 100644 index 00000000..c1dc58ff --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Implementation.json @@ -0,0 +1,544 @@ +{ + "address": "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Blacklisted", + "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": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unblacklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isBlacklisted", + "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": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "transactionHash": "0x23e7c4700fc180cc18d7e8c0aed6e3b20db6405e4afb293b0d169414ee415b83", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "transactionIndex": 10, + "gasUsed": "936792", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb2912070ead512c07d878bd437eda0739db6793373e1ebe1cce5d860dd141f28", + "transactionHash": "0x23e7c4700fc180cc18d7e8c0aed6e3b20db6405e4afb293b0d169414ee415b83", + "logs": [ + { + "transactionIndex": 10, + "blockNumber": 9269426, + "transactionHash": "0x23e7c4700fc180cc18d7e8c0aed6e3b20db6405e4afb293b0d169414ee415b83", + "address": "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 8, + "blockHash": "0xb2912070ead512c07d878bd437eda0739db6793373e1ebe1cce5d860dd141f28" + } + ], + "blockNumber": 9269426, + "cumulativeGasUsed": "3294829", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unblacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"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\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers and getter functions to easily check against this global blacklist.For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Blacklisted(address)\":{\"details\":\"Emitted when `account` is blacklisted.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Unblacklisted(address)\":{\"details\":\"Emitted when `account` is unblacklisted.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"blacklist(address)\":{\"params\":{\"account\":\"The account's address to be blacklisted.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"isBlacklisted(address)\":{\"params\":{\"account\":\"Address of the account to check.\"},\"returns\":{\"_0\":\"'true' if the account is blacklisted, 'false' otherwise\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"unBlacklist(address)\":{\"params\":{\"account\":\"The account's address to be un-blacklisted.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"_list\":{\"details\":\"This mapping is made private and isBlacklisted() should be used instead.This helps saving gas in some scenario. See isBlacklisted() documentation for more details.\"}},\"title\":\"GlobalBlacklist\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"blacklist(address)\":{\"notice\":\"Adds a given account to the blacklist.\"},\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"isBlacklisted(address)\":{\"notice\":\"Checks whether a given account is blacklisted.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"unBlacklist(address)\":{\"notice\":\"Removes a given account from the blacklist.\"}},\"notice\":\"Holds a global mapping of blacklisted accounts shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalBlacklist.sol\":\"GlobalBlacklist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610f8461011860003960008181610278015281816102c101528181610360015281816103a001526104330152610f846000f3fe60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a018129cb5f06c0c7c5a811655ab761d448869bf794f6ffc6aaf1e624507d4f564736f6c63430008120033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a018129cb5f06c0c7c5a811655ab761d448869bf794f6ffc6aaf1e624507d4f564736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Specifically, some contracts within the codebase inherit from the GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers and getter functions to easily check against this global blacklist.For further details, see \"GlobalBlacklist\" section of whitepaper.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Blacklisted(address)": { + "details": "Emitted when `account` is blacklisted." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "Unblacklisted(address)": { + "details": "Emitted when `account` is unblacklisted." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "blacklist(address)": { + "params": { + "account": "The account's address to be blacklisted." + } + }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "details": "See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--" + }, + "globalOwner()": { + "returns": { + "_0": "The address of the GlobalOwner contract." + } + }, + "initialize(address)": { + "details": "See: https://docs.openzeppelin.com/contracts/4.x/upgradeable", + "params": { + "globalOwner_": "The address of the GlobalOwner contract." + } + }, + "isBlacklisted(address)": { + "params": { + "account": "Address of the account to check." + }, + "returns": { + "_0": "'true' if the account is blacklisted, 'false' otherwise" + } + }, + "owner()": { + "returns": { + "_0": "The address of the owner" + } + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "unBlacklist(address)": { + "params": { + "account": "The account's address to be un-blacklisted." + } + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "stateVariables": { + "_list": { + "details": "This mapping is made private and isBlacklisted() should be used instead.This helps saving gas in some scenario. See isBlacklisted() documentation for more details." + } + }, + "title": "GlobalBlacklist", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "blacklist(address)": { + "notice": "Adds a given account to the blacklist." + }, + "constructor": { + "notice": "Prevents implementation contract from being initialized as recommended by OpenZeppelin." + }, + "globalOwner()": { + "notice": "Retrieves the address of GlobalOwner contract." + }, + "initialize(address)": { + "notice": "Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts." + }, + "isBlacklisted(address)": { + "notice": "Checks whether a given account is blacklisted." + }, + "owner()": { + "notice": "Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead." + }, + "renounceOwnership()": { + "notice": "Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "transferOwnership(address)": { + "notice": "Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "unBlacklist(address)": { + "notice": "Removes a given account from the blacklist." + } + }, + "notice": "Holds a global mapping of blacklisted accounts shared by all contracts of the Ledgity Yield codebase.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 116, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "_owner", + "offset": 0, + "slot": "151", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 8691, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "_globalOwner", + "offset": 0, + "slot": "201", + "type": "t_contract(GlobalOwner)5028" + }, + { + "astId": 8775, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 4866, + "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", + "label": "_list", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_address,t_bool)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(GlobalOwner)5028": { + "encoding": "inplace", + "label": "contract GlobalOwner", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Proxy.json b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Proxy.json new file mode 100644 index 00000000..3a7a2bb5 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalBlacklist_Proxy.json @@ -0,0 +1,144 @@ +{ + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "transactionIndex": 3, + "gasUsed": "332581", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000800000000000000000000000000000000000080000000000000080000000000000004000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000200000000000000020000000000000000000000000000000000000000000000000000000", + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58", + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "logs": [ + { + "transactionIndex": 3, + "blockNumber": 9269431, + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000003860d3642e0e6ee4f8af53b39777417eb697b1ec" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58" + }, + { + "transactionIndex": 3, + "blockNumber": 9269431, + "transactionHash": "0x8985975396163dbeba4fd745885f3aaa0bdfcfff5090d5d89a8198f4e7144b59", + "address": "0x546b48297Ce50FA31a383aFe7Df48297337c12B5", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0x624a188c92e3001c102eea63c4f41f2333c551525b5f4b4aeb2809507a0eef58" + } + ], + "blockNumber": 9269431, + "cumulativeGasUsed": "823091", + "status": 1, + "byzantium": true + }, + "args": [ + "0x3860D3642E0e6Ee4f8AF53B39777417eb697B1ec", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalOwner.json b/contracts/hardhat/deployments/baseSepolia/GlobalOwner.json new file mode 100644 index 00000000..62a6c92d --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalOwner.json @@ -0,0 +1,318 @@ +{ + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "transactionIndex": 4, + "gasUsed": "335746", + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000004000000000000000000000000000000020000000000000002000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000080000600000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000400000000002000020002000000000000000000000040000000000000000000000000000000000800000", + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e", + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000cf85a7ef9f59d98f419ba09a075de8319777c218" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + }, + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000069b69dc81caf0b2ff53b946421f51b0ec276e679" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + }, + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + } + ], + "blockNumber": 9269412, + "cumulativeGasUsed": "1722935", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "0x8129fc1c" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [] + }, + "implementation": "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Implementation.json b/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Implementation.json new file mode 100644 index 00000000..48210381 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Implementation.json @@ -0,0 +1,425 @@ +{ + "address": "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": 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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "transactionHash": "0x2e5f74367785c9dc45da2858ecc79f81ee4dd8c7e8a8a1f18743fbc6ab3e9811", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "transactionIndex": 1, + "gasUsed": "862049", + "logsBloom": "0x00000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000008000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6e153c0d137ec69b7e1a782ef2cedb760b50f71dcc1f358c10d4ef2e5438e4da", + "transactionHash": "0x2e5f74367785c9dc45da2858ecc79f81ee4dd8c7e8a8a1f18743fbc6ab3e9811", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 9269407, + "transactionHash": "0x2e5f74367785c9dc45da2858ecc79f81ee4dd8c7e8a8a1f18743fbc6ab3e9811", + "address": "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 0, + "blockHash": "0x6e153c0d137ec69b7e1a782ef2cedb760b50f71dcc1f358c10d4ef2e5438e4da" + } + ], + "blockNumber": 9269407, + "cumulativeGasUsed": "905924", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalOwnableUpgradeable abstract contract. This provides them with an overriden owner() function that retrieves the owner's address from this contract instead.For further details, see \\\"GlobalOwner\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"initialize()\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"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.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalOwner\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"initialize()\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"}},\"notice\":\"Holds the address of a global owner account shared by all contracts of the Ledgity Yield's codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalOwner.sol\":\"GlobalOwner\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2a610118600039600081816101a1015281816101ea01528181610289015281816102c9015261035c0152610e2a6000f3fe6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bf4d86ddafb4e67006b30af9e139567cad9fe8a30e6aad3fb9c85abe69dc796264736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bf4d86ddafb4e67006b30af9e139567cad9fe8a30e6aad3fb9c85abe69dc796264736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Specifically, some contracts within the codebase inherit from the GlobalOwnableUpgradeable abstract contract. This provides them with an overriden owner() function that retrieves the owner's address from this contract instead.For further details, see \"GlobalOwner\" section of whitepaper.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "details": "See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--" + }, + "initialize()": { + "details": "See: https://docs.openzeppelin.com/contracts/4.x/upgradeable" + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "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." + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "title": "GlobalOwner", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "Prevents implementation contract from being initialized as recommended by OpenZeppelin." + }, + "initialize()": { + "notice": "Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts." + } + }, + "notice": "Holds the address of a global owner account shared by all contracts of the Ledgity Yield's codebase.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 116, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "_owner", + "offset": 0, + "slot": "151", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 25, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "_pendingOwner", + "offset": 0, + "slot": "201", + "type": "t_address" + }, + { + "astId": 104, + "contract": "contracts/src/GlobalOwner.sol:GlobalOwner", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Proxy.json b/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Proxy.json new file mode 100644 index 00000000..5a659561 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalOwner_Proxy.json @@ -0,0 +1,158 @@ +{ + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "transactionIndex": 4, + "gasUsed": "335746", + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000004000000000000000000000000000000020000000000000002000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000080000600000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000400000000002000020002000000000000000000000040000000000000000000000000000000000800000", + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e", + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000cf85a7ef9f59d98f419ba09a075de8319777c218" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + }, + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000069b69dc81caf0b2ff53b946421f51b0ec276e679" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + }, + { + "transactionIndex": 4, + "blockNumber": 9269412, + "transactionHash": "0xb23034eec0f390b17591f72365579c1b6b0905a5d0c00dc2d2addb3359c53c2f", + "address": "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0xd414684927d6536a6f3a5760eba18bb46342a6f034426d7977143fb782666f9e" + } + ], + "blockNumber": 9269412, + "cumulativeGasUsed": "1722935", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcF85a7eF9f59D98F419Ba09a075De8319777C218", + "0x8129fc1c" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalPause.json b/contracts/hardhat/deployments/baseSepolia/GlobalPause.json new file mode 100644 index 00000000..516e0eb6 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalPause.json @@ -0,0 +1,339 @@ +{ + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "transactionIndex": 2, + "gasUsed": "335159", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000800000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000004000000080000000000000000020000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f", + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 9269421, + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001f3c77be982b11a391646cc50149f3cd23a7b61b" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f" + }, + { + "transactionIndex": 2, + "blockNumber": 9269421, + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 3, + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f" + } + ], + "blockNumber": 9269421, + "cumulativeGasUsed": "713718", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [ + "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2" + ] + }, + "implementation": "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalPause_Implementation.json b/contracts/hardhat/deployments/baseSepolia/GlobalPause_Implementation.json new file mode 100644 index 00000000..bdd968b8 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalPause_Implementation.json @@ -0,0 +1,501 @@ +{ + "address": "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "transactionHash": "0xc81e6ee5a0e7dc83db7df59db77c28fb140ef03b6e714ca466fa3189c53abadc", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "transactionIndex": 3, + "gasUsed": "955363", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000002000200000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc2a381a701ec494a7473faa051def917e1849132c042b5dcb172bd78be9a708c", + "transactionHash": "0xc81e6ee5a0e7dc83db7df59db77c28fb140ef03b6e714ca466fa3189c53abadc", + "logs": [ + { + "transactionIndex": 3, + "blockNumber": 9269417, + "transactionHash": "0xc81e6ee5a0e7dc83db7df59db77c28fb140ef03b6e714ca466fa3189c53abadc", + "address": "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 3, + "blockHash": "0xc2a381a701ec494a7473faa051def917e1849132c042b5dcb172bd78be9a708c" + } + ], + "blockNumber": 9269417, + "cumulativeGasUsed": "1673480", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalPausableUpgradeable abstract contract. This provides them with an overriden paused() function that retrieves the pause state from this contract instead.For further details, see \\\"GlobalPause\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"pause()\":{\"details\":\"Public implementation of PausableUpgradeable's pausing and unpausing functions but restricted to contract's owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalPause\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Holds a global pause state shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalPause.sol\":\"GlobalPause\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610fda610118600039600081816101f50152818161023e015281816102ef0152818161032f01526103c20152610fda6000f3fe60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b6850ce781cface9fdf0c166b79d65bd4bbb2d52856d077ee54eb215d1371b564736f6c63430008120033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b6850ce781cface9fdf0c166b79d65bd4bbb2d52856d077ee54eb215d1371b564736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Specifically, some contracts within the codebase inherit from the GlobalPausableUpgradeable abstract contract. This provides them with an overriden paused() function that retrieves the pause state from this contract instead.For further details, see \"GlobalPause\" section of whitepaper.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "Paused(address)": { + "details": "Emitted when the pause is triggered by `account`." + }, + "Unpaused(address)": { + "details": "Emitted when the pause is lifted by `account`." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "details": "See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--" + }, + "globalOwner()": { + "returns": { + "_0": "The address of the GlobalOwner contract." + } + }, + "initialize(address)": { + "details": "See: https://docs.openzeppelin.com/contracts/4.x/upgradeable", + "params": { + "globalOwner_": "The address of the GlobalOwner contract." + } + }, + "owner()": { + "returns": { + "_0": "The address of the owner" + } + }, + "pause()": { + "details": "Public implementation of PausableUpgradeable's pausing and unpausing functions but restricted to contract's owner." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "title": "GlobalPause", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "Prevents implementation contract from being initialized as recommended by OpenZeppelin." + }, + "globalOwner()": { + "notice": "Retrieves the address of GlobalOwner contract." + }, + "initialize(address)": { + "notice": "Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts." + }, + "owner()": { + "notice": "Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead." + }, + "renounceOwnership()": { + "notice": "Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "transferOwnership(address)": { + "notice": "Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + } + }, + "notice": "Holds a global pause state shared by all contracts of the Ledgity Yield codebase.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 116, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "_owner", + "offset": 0, + "slot": "151", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 8691, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "_globalOwner", + "offset": 0, + "slot": "201", + "type": "t_contract(GlobalOwner)5028" + }, + { + "astId": 8775, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 928, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "_paused", + "offset": 0, + "slot": "252", + "type": "t_bool" + }, + { + "astId": 1033, + "contract": "contracts/src/GlobalPause.sol:GlobalPause", + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(GlobalOwner)5028": { + "encoding": "inplace", + "label": "contract GlobalOwner", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/GlobalPause_Proxy.json b/contracts/hardhat/deployments/baseSepolia/GlobalPause_Proxy.json new file mode 100644 index 00000000..8f1c2a66 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/GlobalPause_Proxy.json @@ -0,0 +1,144 @@ +{ + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "transactionIndex": 2, + "gasUsed": "335159", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000800000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000004000000080000000000000000020000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f", + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 9269421, + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001f3c77be982b11a391646cc50149f3cd23a7b61b" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f" + }, + { + "transactionIndex": 2, + "blockNumber": 9269421, + "transactionHash": "0xbfe5404b37eaf5c9a32b386664e15bb938e66ceab38d30aa011b15cf514e062e", + "address": "0x9992CC9176f2b86c56FDA697D814C1a054C2035e", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 3, + "blockHash": "0xa0e5f2241e4413c854e37fdfc5dae489206d959ee7f3148c655af621c151367f" + } + ], + "blockNumber": 9269421, + "cumulativeGasUsed": "713718", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1f3c77bE982B11a391646CC50149f3cD23A7b61B", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LDY.json b/contracts/hardhat/deployments/baseSepolia/LDY.json new file mode 100644 index 00000000..1ec61dcb --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LDY.json @@ -0,0 +1,485 @@ +{ + "address": "0xE376Bd13399F1f86ad659145A2BED2cDC24a7E5E", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "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": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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" + } + ], + "transactionHash": "0x485a86d79fd8c3c604a79ae882f7f4de0cecb5c5ab44a30e2fd21aac0ee649ab", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0xE376Bd13399F1f86ad659145A2BED2cDC24a7E5E", + "transactionIndex": 6, + "gasUsed": "716757", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000008000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000400000002000020000000000000000000000000000000000000000000000000000000000000800000", + "blockHash": "0x7f84da5102ddb2a9b06256fcd1f142a5ecab400a7d4556a0cd1529d5c9fbf7eb", + "transactionHash": "0x485a86d79fd8c3c604a79ae882f7f4de0cecb5c5ab44a30e2fd21aac0ee649ab", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 9269441, + "transactionHash": "0x485a86d79fd8c3c604a79ae882f7f4de0cecb5c5ab44a30e2fd21aac0ee649ab", + "address": "0xE376Bd13399F1f86ad659145A2BED2cDC24a7E5E", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000069b69dc81caf0b2ff53b946421f51b0ec276e679" + ], + "data": "0x0000000000000000000000000000000000000000003e09de2596099e2b000000", + "logIndex": 4, + "blockHash": "0x7f84da5102ddb2a9b06256fcd1f142a5ecab400a7d4556a0cd1529d5c9fbf7eb" + } + ], + "blockNumber": 9269441, + "cumulativeGasUsed": "1529152", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\"}],\"devdoc\":{\"author\":\"Lila Rest (lila@ledgity.com)\",\"custom:security-contact\":\"security@ledgity.com\",\"details\":\"The $LDY is the utility and governance token of the entire Ledgity ecosystem. This contract has been kept as minimal as possible to enforce stakeholders safety but also to pave the way for sensitive use cases like cross-chain bridging, use in governance scenarios, and compatibility with 3rd party DApps. It is non-upgradeable, non-ownable, non-pausable, non-mintable, and non-restrictable. It implements nothing more than what is provided by its OpenZepellin ancestors. Moreover, to eliminate the need for ownership and complex vesting functions, the entire supply is minted at deployment-time. Vesting of allocated tokens is then managed via Sablier streams that anyone can verify on this page: https://docs.ledgity.finance/tokenomics/vesting-proofs Specifications: - Name: Ledgity Token - Symbol: LDY - Decimals: 18 - Total supply: 75,000,000\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"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(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"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`.\"},\"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.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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`.\"}},\"title\":\"LDY\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LDY.sol\":\"LDY\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n _spendAllowance(account, _msgSender(), amount);\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x0d19410453cda55960a818e02bd7c18952a5c8fe7a3036e81f0d599f34487a7b\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/LDY.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20} from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport {ERC20Burnable} from \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @title LDY\\n * @author Lila Rest (lila@ledgity.com)\\n * @dev The $LDY is the utility and governance token of the entire Ledgity ecosystem.\\n *\\n * This contract has been kept as minimal as possible to enforce stakeholders safety\\n * but also to pave the way for sensitive use cases like cross-chain bridging, use in\\n * governance scenarios, and compatibility with 3rd party DApps.\\n *\\n * It is non-upgradeable, non-ownable, non-pausable, non-mintable, and non-restrictable.\\n * It implements nothing more than what is provided by its OpenZepellin ancestors.\\n *\\n * Moreover, to eliminate the need for ownership and complex vesting functions, the\\n * entire supply is minted at deployment-time. Vesting of allocated tokens is then\\n * managed via Sablier streams that anyone can verify on this page:\\n * https://docs.ledgity.finance/tokenomics/vesting-proofs\\n *\\n * Specifications:\\n * - Name: Ledgity Token\\n * - Symbol: LDY\\n * - Decimals: 18\\n * - Total supply: 75,000,000\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDY is ERC20, ERC20Burnable {\\n constructor() ERC20(\\\"Ledgity Token\\\", \\\"LDY\\\") {\\n _mint(msg.sender, 75_000_000 * 10 ** decimals());\\n }\\n}\\n\",\"keccak256\":\"0x7047fcacb023cb7af24c4d1d30ee577ba1fbab669f7f3f2463f3c729292e6d1d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600d81526020016c2632b233b4ba3c902a37b5b2b760991b815250604051806040016040528060038152602001624c445960e81b815250816003908162000065919062000229565b50600462000074828262000229565b505050620000af336200008c620000b560201b60201c565b6200009990600a6200040a565b620000a99063047868c062000422565b620000ba565b62000452565b601290565b6001600160a01b038216620001155760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200012991906200043c565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b057607f821691505b602082108103620001d157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018057600081815260208120601f850160051c81016020861015620002005750805b601f850160051c820191505b8181101562000221578281556001016200020c565b505050505050565b81516001600160401b0381111562000245576200024562000185565b6200025d816200025684546200019b565b84620001d7565b602080601f8311600181146200029557600084156200027c5750858301515b600019600386901b1c1916600185901b17855562000221565b600085815260208120601f198616915b82811015620002c657888601518255948401946001909101908401620002a5565b5085821015620002e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200034c578160001904821115620003305762000330620002f5565b808516156200033e57918102915b93841c939080029062000310565b509250929050565b600082620003655750600162000404565b81620003745750600062000404565b81600181146200038d57600281146200039857620003b8565b600191505062000404565b60ff841115620003ac57620003ac620002f5565b50506001821b62000404565b5060208310610133831016604e8410600b8410161715620003dd575081810a62000404565b620003e983836200030b565b8060001904821115620004005762000400620002f5565b0290505b92915050565b60006200041b60ff84168362000354565b9392505050565b8082028115828204841417620004045762000404620002f5565b80820180821115620004045762000404620002f5565b610a0a80620004626000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101ad578063a457c2d7146101b5578063a9059cbb146101c8578063dd62ed3e146101db57600080fd5b806342966c681461015c57806370a082311461017157806379cc67901461019a57600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd14610127578063313ce5671461013a5780633950935114610149575b600080fd5b6100dc6101ee565b6040516100e9919061083b565b60405180910390f35b6101056101003660046108a5565b610280565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b6101056101353660046108cf565b61029a565b604051601281526020016100e9565b6101056101573660046108a5565b6102be565b61016f61016a36600461090b565b6102e0565b005b61011961017f366004610924565b6001600160a01b031660009081526020819052604090205490565b61016f6101a83660046108a5565b6102ed565b6100dc610306565b6101056101c33660046108a5565b610315565b6101056101d63660046108a5565b610395565b6101196101e9366004610946565b6103a3565b6060600380546101fd90610979565b80601f016020809104026020016040519081016040528092919081815260200182805461022990610979565b80156102765780601f1061024b57610100808354040283529160200191610276565b820191906000526020600020905b81548152906001019060200180831161025957829003601f168201915b5050505050905090565b60003361028e8185856103ce565b60019150505b92915050565b6000336102a88582856104f3565b6102b385858561056d565b506001949350505050565b60003361028e8185856102d183836103a3565b6102db91906109b3565b6103ce565b6102ea3382610711565b50565b6102f88233836104f3565b6103028282610711565b5050565b6060600480546101fd90610979565b6000338161032382866103a3565b9050838110156103885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102b382868684036103ce565b60003361028e81858561056d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161037f565b6001600160a01b0382166104915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161037f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006104ff84846103a3565b90506000198114610567578181101561055a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161037f565b61056784848484036103ce565b50505050565b6001600160a01b0383166105d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161037f565b6001600160a01b0382166106335760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161037f565b6001600160a01b038316600090815260208190526040902054818110156106ab5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161037f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610567565b6001600160a01b0382166107715760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161037f565b6001600160a01b038216600090815260208190526040902054818110156107e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161037f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016104e6565b600060208083528351808285015260005b818110156108685785810183015185820160400152820161084c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146108a057600080fd5b919050565b600080604083850312156108b857600080fd5b6108c183610889565b946020939093013593505050565b6000806000606084860312156108e457600080fd5b6108ed84610889565b92506108fb60208501610889565b9150604084013590509250925092565b60006020828403121561091d57600080fd5b5035919050565b60006020828403121561093657600080fd5b61093f82610889565b9392505050565b6000806040838503121561095957600080fd5b61096283610889565b915061097060208401610889565b90509250929050565b600181811c9082168061098d57607f821691505b6020821081036109ad57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561029457634e487b7160e01b600052601160045260246000fdfea2646970667358221220c86cf8e823f28896890e319ee49aa9dcd9fffb156f0ab5c0a37a11e85937613564736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101ad578063a457c2d7146101b5578063a9059cbb146101c8578063dd62ed3e146101db57600080fd5b806342966c681461015c57806370a082311461017157806379cc67901461019a57600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd14610127578063313ce5671461013a5780633950935114610149575b600080fd5b6100dc6101ee565b6040516100e9919061083b565b60405180910390f35b6101056101003660046108a5565b610280565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b6101056101353660046108cf565b61029a565b604051601281526020016100e9565b6101056101573660046108a5565b6102be565b61016f61016a36600461090b565b6102e0565b005b61011961017f366004610924565b6001600160a01b031660009081526020819052604090205490565b61016f6101a83660046108a5565b6102ed565b6100dc610306565b6101056101c33660046108a5565b610315565b6101056101d63660046108a5565b610395565b6101196101e9366004610946565b6103a3565b6060600380546101fd90610979565b80601f016020809104026020016040519081016040528092919081815260200182805461022990610979565b80156102765780601f1061024b57610100808354040283529160200191610276565b820191906000526020600020905b81548152906001019060200180831161025957829003601f168201915b5050505050905090565b60003361028e8185856103ce565b60019150505b92915050565b6000336102a88582856104f3565b6102b385858561056d565b506001949350505050565b60003361028e8185856102d183836103a3565b6102db91906109b3565b6103ce565b6102ea3382610711565b50565b6102f88233836104f3565b6103028282610711565b5050565b6060600480546101fd90610979565b6000338161032382866103a3565b9050838110156103885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102b382868684036103ce565b60003361028e81858561056d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161037f565b6001600160a01b0382166104915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161037f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006104ff84846103a3565b90506000198114610567578181101561055a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161037f565b61056784848484036103ce565b50505050565b6001600160a01b0383166105d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161037f565b6001600160a01b0382166106335760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161037f565b6001600160a01b038316600090815260208190526040902054818110156106ab5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161037f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610567565b6001600160a01b0382166107715760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161037f565b6001600160a01b038216600090815260208190526040902054818110156107e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161037f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016104e6565b600060208083528351808285015260005b818110156108685785810183015185820160400152820161084c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146108a057600080fd5b919050565b600080604083850312156108b857600080fd5b6108c183610889565b946020939093013593505050565b6000806000606084860312156108e457600080fd5b6108ed84610889565b92506108fb60208501610889565b9150604084013590509250925092565b60006020828403121561091d57600080fd5b5035919050565b60006020828403121561093657600080fd5b61093f82610889565b9392505050565b6000806040838503121561095957600080fd5b61096283610889565b915061097060208401610889565b90509250929050565b600181811c9082168061098d57607f821691505b6020821081036109ad57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561029457634e487b7160e01b600052601160045260246000fdfea2646970667358221220c86cf8e823f28896890e319ee49aa9dcd9fffb156f0ab5c0a37a11e85937613564736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (lila@ledgity.com)", + "custom:security-contact": "security@ledgity.com", + "details": "The $LDY is the utility and governance token of the entire Ledgity ecosystem. This contract has been kept as minimal as possible to enforce stakeholders safety but also to pave the way for sensitive use cases like cross-chain bridging, use in governance scenarios, and compatibility with 3rd party DApps. It is non-upgradeable, non-ownable, non-pausable, non-mintable, and non-restrictable. It implements nothing more than what is provided by its OpenZepellin ancestors. Moreover, to eliminate the need for ownership and complex vesting functions, the entire supply is minted at deployment-time. Vesting of allocated tokens is then managed via Sablier streams that anyone can verify on this page: https://docs.ledgity.finance/tokenomics/vesting-proofs Specifications: - Name: Ledgity Token - Symbol: LDY - Decimals: 18 - Total supply: 75,000,000", + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "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(uint256)": { + "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}." + }, + "burnFrom(address,uint256)": { + "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`." + }, + "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`." + }, + "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." + }, + "name()": { + "details": "Returns the name of the token." + }, + "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`." + } + }, + "title": "LDY", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 3300, + "contract": "contracts/src/LDY.sol:LDY", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 3306, + "contract": "contracts/src/LDY.sol:LDY", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 3308, + "contract": "contracts/src/LDY.sol:LDY", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 3310, + "contract": "contracts/src/LDY.sol:LDY", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 3312, + "contract": "contracts/src/LDY.sol:LDY", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "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_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_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LDYStaking.json b/contracts/hardhat/deployments/baseSepolia/LDYStaking.json new file mode 100644 index 00000000..5eba3812 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LDYStaking.json @@ -0,0 +1,895 @@ +{ + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rewardAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardPerSec", + "type": "uint256" + } + ], + "name": "NotifiedRewardAmount", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstaked", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "finishAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getEarnedUser", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getUserStakes", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "internalType": "struct LDYStaking.StakingInfo[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "highTierAccounts", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "stakeRewardToken_", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "stakeDurations_", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "stakeDurationForPerks_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeAmountForPerks_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRatePerSec", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "stakeDurationIndex", + "type": "uint8" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeAmountForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeDurationForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakeDurations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeRewardToken", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userStakingInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "transactionIndex": 10, + "gasUsed": "585170", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000001000000000000000500000000000000000000000000000000000000000000000000000000000000000002000000000000004000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000004000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3", + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "logs": [ + { + "transactionIndex": 10, + "blockNumber": 9269451, + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001157f1b171dc382165389c43a70de2e73da3645e" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3" + }, + { + "transactionIndex": 10, + "blockNumber": 9269451, + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 7, + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3" + } + ], + "blockNumber": 9269451, + "cumulativeGasUsed": "4825667", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1157f1b171DC382165389c43a70De2E73da3645E", + "0x98645a1f00000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b20000000000000000000000009992cc9176f2b86c56fda697d814c1a054c2035e000000000000000000000000546b48297ce50fa31a383afe7df48297337c12b5000000000000000000000000e376bd13399f1f86ad659145a2bed2cdc24a7e5e00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000001ea6e0000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000028de800000000000000000000000000000000000000000000000000000000000f537000000000000000000000000000000000000000000000000000000000001ea6e000000000000000000000000000000000000000000000000000000000003d4dc000000000000000000000000000000000000000000000000000000000005bf4a00" + ], + "numDeployments": 2, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "implementation": "0xFFF42672fb476afe698142A9B6211b772b89b8Ee", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LDYStaking_Implementation.json b/contracts/hardhat/deployments/baseSepolia/LDYStaking_Implementation.json new file mode 100644 index 00000000..8044616e --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LDYStaking_Implementation.json @@ -0,0 +1,1523 @@ +{ + "address": "0xFFF42672fb476afe698142A9B6211b772b89b8Ee", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rewardAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardPerSec", + "type": "uint256" + } + ], + "name": "NotifiedRewardAmount", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "finishAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getEarnedUser", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getUserStakes", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "internalType": "struct LDYStaking.StakingInfo[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "highTierAccounts", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "stakeRewardToken_", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "stakeDurations_", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "stakeDurationForPerks_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeAmountForPerks_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRatePerSec", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "stakeDurationIndex", + "type": "uint8" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeAmountForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeDurationForPerks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakeDurations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeRewardToken", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "tierOf", + "outputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userStakingInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "stakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unStakeAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardPerTokenPaid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x33785ece579b1470af6c6a48c964631fd8ab0ba459b8de74d03bafdbb09b5339", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0xFFF42672fb476afe698142A9B6211b772b89b8Ee", + "transactionIndex": 6, + "gasUsed": "2523537", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb27fb208357346359792b1fb61780925f022dabb4390d3499a4f57f4a5a4ddc7", + "transactionHash": "0x33785ece579b1470af6c6a48c964631fd8ab0ba459b8de74d03bafdbb09b5339", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 9344968, + "transactionHash": "0x33785ece579b1470af6c6a48c964631fd8ab0ba459b8de74d03bafdbb09b5339", + "address": "0xFFF42672fb476afe698142A9B6211b772b89b8Ee", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 7, + "blockHash": "0xb27fb208357346359792b1fb61780925f022dabb4390d3499a4f57f4a5a4ddc7" + } + ], + "blockNumber": 9344968, + "cumulativeGasUsed": "3222745", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 2, + "solcInputHash": "c8300f1cd6a8c81a83ee050186e6d667", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardPerSec\",\"type\":\"uint256\"}],\"name\":\"NotifiedRewardAmount\",\"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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"RewardPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finishAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getEarnedUser\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"}],\"name\":\"getReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getUserStakes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stakedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unStakeAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardPerTokenPaid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"}],\"internalType\":\"struct LDYStaking.StakingInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalBlacklist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalPause\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"highTierAccounts\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalPause_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalBlacklist_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"stakeRewardToken_\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"stakeDurations_\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"stakeDurationForPerks_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmountForPerks_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdateTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"notifyRewardAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerTokenStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRatePerSec\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardsDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"setRewardsDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"stakeDurationIndex\",\"type\":\"uint8\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeAmountForPerks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeDurationForPerks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakeDurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeRewardToken\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"tierOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeIndex\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userStakingInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unStakeAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardPerTokenPaid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"This contract implements tierOf() function from LDYStaking as it's the only one the LToken contract relies on.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"NotifiedRewardAmount(uint256,uint256)\":{\"params\":{\"rewardAmount\":\"Reward amount added by admin.\",\"rewardPerSec\":\"RewardRatePerSec updated.\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"RewardPaid(address,uint256,uint256)\":{\"params\":{\"reward\":\"Reward token amount\",\"stakeIndex\":\"User staking pool index\",\"user\":\"User address\"}},\"Staked(address,uint256,uint256)\":{\"params\":{\"amount\":\"Staked amount\",\"stakeIndex\":\"Latest index of user staking pool\",\"user\":\"User address\"}},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Unstaked(address,uint256,uint256)\":{\"params\":{\"amount\":\"Staked amount\",\"stakeIndex\":\"User staking pool index\",\"user\":\"User address\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"earned(address,uint256)\":{\"params\":{\"account\":\"Address of the user.\",\"stakeIndex\":\"Index of the stakePool\"},\"returns\":{\"_0\":\"Return earned amounts\"}},\"getEarnedUser(address)\":{\"params\":{\"account\":\"Address of the user.\"},\"returns\":{\"_0\":\"Return earned rewards array for a user.\"}},\"getReward(uint256)\":{\"details\":\"Emits a `RewardPaid` event upon successful reward claim.\",\"params\":{\"stakeIndex\":\"The index of user staking pool.\"}},\"getUserStakes(address)\":{\"params\":{\"account\":\"The address of user.\"},\"returns\":{\"_0\":\"StakingInfo array.\"}},\"globalBlacklist()\":{\"returns\":{\"_0\":\"The address of the GlobalBlacklist contract.\"}},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"globalPause()\":{\"returns\":{\"_0\":\"The address of the GlobalPause contract.\"}},\"initialize(address,address,address,address,uint256[],uint256,uint256)\":{\"details\":\"This function is intended for setting initial values for the contract's state variables.\",\"params\":{\"globalBlacklist_\":\"The address of the GlobalBlacklist contract.\",\"globalOwner_\":\"The address of the GlobalOwner contract.\",\"globalPause_\":\"The address of the GlobalPause contract.\",\"stakeAmountForPerks_\":\"Minimal staking amount for perks.\",\"stakeDurationForPerks_\":\"Minimal staking duration for perks.\",\"stakeDurations_\":\"Available Staking Durations.\",\"stakeRewardToken_\":\"The address of stake and reward token(LDY token).\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"Timestamp of the most recent rewards calculation.\"}},\"notifyRewardAmount(uint256)\":{\"details\":\"Only callable by owner.\",\"params\":{\"amount\":\"The amount of reward to be distributed.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether the contract is paused or not.\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"recoverERC20(address,uint256)\":{\"params\":{\"amount\":\"The amount of token to recover.\",\"tokenAddress\":\"The address of the token to recover.\"}},\"rewardPerToken()\":{\"returns\":{\"_0\":\"Current reward per token.\"}},\"setRewardsDuration(uint256)\":{\"details\":\"Only callable by owner, and setting available only after rewards period.\",\"params\":{\"duration\":\"The nmew rewards duration in seconds.\"}},\"stake(uint256,uint8)\":{\"details\":\"Emits a `Staked` event upon successful staking.\",\"params\":{\"amount\":\"The amount of tokens to stake.\",\"stakeDurationIndex\":\"The Index of stakeDurations array.\"}},\"tierOf(address)\":{\"details\":\"tierOf() function that always return that the given account is not elligible to any LDY staking tier, except if the account is in the highTierAccounts mapping.\",\"params\":{\"account\":\"The account to check the tier of.\"}},\"unstake(uint256,uint256)\":{\"details\":\"Emits a `Unstaked` event upon successful withdrawal. On full withdrawal, userStakingInfo removes stake pool for stakeIndex.\",\"params\":{\"amount\":\"The amount of tokens to withdraw.\",\"stakeIndex\":\"The index of user staking pool\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"highTierAccounts\":{\"details\":\"This is notably used to allow PreMining contracts to benefit from 0% withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\"}},\"title\":\"LDYStaking\",\"version\":1},\"userdoc\":{\"events\":{\"NotifiedRewardAmount(uint256,uint256)\":{\"notice\":\"Emitted when admin add rewards.\"},\"RewardPaid(address,uint256,uint256)\":{\"notice\":\"Emitted when users claim rewards\"},\"Staked(address,uint256,uint256)\":{\"notice\":\"Emitted when users stake token\"},\"Unstaked(address,uint256,uint256)\":{\"notice\":\"Emitted when users unstake token\"}},\"kind\":\"user\",\"methods\":{\"earned(address,uint256)\":{\"notice\":\"Calculate the user's stake pool earnings\"},\"finishAt()\":{\"notice\":\"Timestamp of when the rewards finish.\"},\"getEarnedUser(address)\":{\"notice\":\"Get the earned rewards array for a user.\"},\"getReward(uint256)\":{\"notice\":\"Claim pending rewards.\"},\"getUserStakes(address)\":{\"notice\":\"Get User Stake Data.\"},\"globalBlacklist()\":{\"notice\":\"Retrieves the address of GlobalBlacklist contract.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"globalPause()\":{\"notice\":\"Retrieves the address of GlobalPause contract.\"},\"highTierAccounts(address)\":{\"notice\":\"Holds a mapping of addresses that default to the highest staking tier.\"},\"initialize(address,address,address,address,uint256[],uint256,uint256)\":{\"notice\":\"Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Get the last time when rewards were applicable for the specified reward token.\"},\"lastUpdateTime()\":{\"notice\":\"Timestamp of the reward updated.\"},\"notifyRewardAmount(uint256)\":{\"notice\":\"Notify the contract about the amount of rewards to be distributed and update reward parameters.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"paused()\":{\"notice\":\"Override of PausableUpgradeable.pause() that retrieves the pause state from the GlobalPause contract instead.\"},\"recoverERC20(address,uint256)\":{\"notice\":\"Recovers a specified amount of a given token address. Will fail if the contract doesn't hold enough tokens.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"rewardPerToken()\":{\"notice\":\"Calculate the reward per token for a given reward token.\"},\"rewardPerTokenStored()\":{\"notice\":\"Reward per token stored, sum of (reward rate * dt * 1e18 / total supply).\"},\"rewardRatePerSec()\":{\"notice\":\"Reward per second(total rewards / duration).\"},\"rewardsDuration()\":{\"notice\":\"Duration of the rewards (in seconds).\"},\"setRewardsDuration(uint256)\":{\"notice\":\"Update Rewards Duration.\"},\"stake(uint256,uint8)\":{\"notice\":\"Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards.\"},\"stakeAmountForPerks()\":{\"notice\":\"Minimal stake amount for perks.\"},\"stakeDurationForPerks()\":{\"notice\":\"Minimal stake duration for perks.\"},\"stakeDurations(uint256)\":{\"notice\":\"Stake durations.\"},\"stakeRewardToken()\":{\"notice\":\"Stake and Reward token.\"},\"totalStaked()\":{\"notice\":\"Total staked amounts.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"unstake(uint256,uint256)\":{\"notice\":\"Withdraw staked tokens after stakeDuration has passed.\"},\"userStakingInfo(address,uint256)\":{\"notice\":\"User stakingInfo map, user address => array of the staking info\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LDYStaking.sol\":\"LDYStaking\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\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\",\"keccak256\":\"0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\\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\",\"keccak256\":\"0x0e1f0f5f62f67a881cd1a9597acbc0a5e4071f3c2c10449a183b922ae7272e3f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\\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\",\"keccak256\":\"0xd60f939a3ca0199014d079b4dd66aa757954334947d81eb5c1d35d7a83061ab3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../extensions/IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\\n * 0 before setting it to a non-zero value.\\n */\\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20PermitUpgradeable token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0x4dae161227d332808312ee2caf6384929321b83c16cc89b5642985fbec6b814c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/LDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {ReentrancyGuardUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport {BaseUpgradeable} from \\\"./abstracts/base/BaseUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @custom:security-contact security@ledgity.com\\n *\\n * @dev This contract implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is BaseUpgradeable, ReentrancyGuardUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Represents a user staking info in array.\\n * @param stakedAmount Amount of the stake.\\n * @param unStakeAt Unstake at.\\n * @param duration Staking period in seconds.\\n * @param rewardPerTokenPaid Reward per token paid.\\n * @param rewards Rewards to be claimed.\\n */\\n struct StakingInfo {\\n uint256 stakedAmount;\\n uint256 unStakeAt;\\n uint256 duration;\\n uint256 rewardPerTokenPaid;\\n uint256 rewards;\\n }\\n\\n /// @notice Stake and Reward token.\\n IERC20Upgradeable public stakeRewardToken;\\n\\n /// @notice Minimal stake duration for perks.\\n uint256 public stakeDurationForPerks;\\n\\n /// @notice Minimal stake amount for perks.\\n uint256 public stakeAmountForPerks;\\n\\n /// @notice Stake durations.\\n uint256[] public stakeDurations;\\n\\n /// @notice Duration of the rewards (in seconds).\\n uint256 public rewardsDuration;\\n\\n /// @notice Timestamp of when the rewards finish.\\n uint256 public finishAt;\\n\\n /// @notice Timestamp of the reward updated.\\n uint256 public lastUpdateTime;\\n\\n /// @notice Reward per second(total rewards / duration).\\n uint256 public rewardRatePerSec;\\n\\n /// @notice Reward per token stored, sum of (reward rate * dt * 1e18 / total supply).\\n uint256 public rewardPerTokenStored;\\n\\n /// @notice Total staked amounts.\\n uint256 public totalStaked;\\n\\n /// @notice User stakingInfo map, user address => array of the staking info\\n mapping(address => StakingInfo[]) public userStakingInfo;\\n\\n /**\\n * @notice Emitted when users stake token\\n * @param user User address\\n * @param stakeIndex Latest index of user staking pool\\n * @param amount Staked amount\\n */\\n event Staked(address indexed user, uint256 stakeIndex, uint256 amount);\\n\\n /**\\n * @notice Emitted when users unstake token\\n * @param user User address\\n * @param stakeIndex User staking pool index\\n * @param amount Staked amount\\n */\\n event Unstaked(address indexed user, uint256 stakeIndex, uint256 amount);\\n\\n /**\\n * @notice Emitted when users claim rewards\\n * @param user User address\\n * @param stakeIndex User staking pool index\\n * @param reward Reward token amount\\n */\\n event RewardPaid(address indexed user, uint256 stakeIndex, uint256 reward);\\n\\n /**\\n * @notice Emitted when admin add rewards.\\n * @param rewardAmount Reward amount added by admin.\\n * @param rewardPerSec RewardRatePerSec updated.\\n */\\n event NotifiedRewardAmount(uint256 rewardAmount, uint256 rewardPerSec);\\n\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once.\\n * @dev This function is intended for setting initial values for the contract's state variables.\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param stakeRewardToken_ The address of stake and reward token(LDY token).\\n * @param stakeDurations_ Available Staking Durations.\\n * @param stakeDurationForPerks_ Minimal staking duration for perks.\\n * @param stakeAmountForPerks_ Minimal staking amount for perks.\\n */\\n function initialize(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address stakeRewardToken_,\\n uint256[] memory stakeDurations_,\\n uint256 stakeDurationForPerks_,\\n uint256 stakeAmountForPerks_\\n ) public initializer {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n stakeRewardToken = IERC20Upgradeable(stakeRewardToken_);\\n stakeDurations = stakeDurations_;\\n stakeDurationForPerks = stakeDurationForPerks_;\\n stakeAmountForPerks = stakeAmountForPerks_;\\n }\\n\\n // --------------------\\n // MUTATIVE FUNCTIONS\\n // --------------------\\n\\n /**\\n * @notice Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards.\\n * @dev Emits a `Staked` event upon successful staking.\\n * @param amount The amount of tokens to stake.\\n * @param stakeDurationIndex The Index of stakeDurations array.\\n */\\n function stake(\\n uint256 amount,\\n uint8 stakeDurationIndex\\n ) external nonReentrant whenNotPaused notBlacklisted(_msgSender()) {\\n require(amount > 0, \\\"amount = 0\\\");\\n require(stakeDurationIndex <= stakeDurations.length - 1, \\\"invalid staking period\\\");\\n\\n _updateReward(address(0), 0);\\n uint256 stakeDuration = stakeDurations[stakeDurationIndex];\\n StakingInfo memory stakingInfo = StakingInfo({\\n stakedAmount: amount,\\n unStakeAt: block.timestamp + stakeDuration,\\n duration: stakeDuration,\\n rewardPerTokenPaid: rewardPerTokenStored,\\n rewards: 0\\n });\\n\\n // check whether account is eligible for benefit from the protocol\\n if (stakeDuration >= stakeDurationForPerks && amount >= stakeAmountForPerks) {\\n highTierAccounts[_msgSender()] = true;\\n }\\n\\n userStakingInfo[_msgSender()].push(stakingInfo);\\n\\n uint256 stakeIndex = userStakingInfo[_msgSender()].length - 1;\\n totalStaked += amount;\\n\\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\\n\\n emit Staked(_msgSender(), stakeIndex, amount);\\n }\\n\\n /**\\n * @notice Withdraw staked tokens after stakeDuration has passed.\\n * @dev Emits a `Unstaked` event upon successful withdrawal.\\n * On full withdrawal, userStakingInfo removes stake pool for stakeIndex.\\n * @param amount The amount of tokens to withdraw.\\n * @param stakeIndex The index of user staking pool\\n */\\n function unstake(\\n uint256 amount,\\n uint256 stakeIndex\\n ) external nonReentrant notBlacklisted(_msgSender()) {\\n require(amount > 0, \\\"amount = 0\\\");\\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \\\"invalid stakeIndex\\\");\\n require(\\n block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt,\\n \\\"not allowed unstaking in the staking period\\\"\\n );\\n require(\\n amount <= userStakingInfo[_msgSender()][stakeIndex].stakedAmount,\\n \\\"insufficient amount\\\"\\n );\\n\\n _updateReward(_msgSender(), stakeIndex);\\n totalStaked -= amount;\\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount -= amount;\\n\\n // check whether account is eligible for benefit from the protocol\\n if (\\n userStakingInfo[_msgSender()][stakeIndex].duration >= stakeDurationForPerks &&\\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount < stakeAmountForPerks\\n ) {\\n highTierAccounts[_msgSender()] = false;\\n }\\n\\n // remove staking info from array on full withdrawal\\n if (userStakingInfo[_msgSender()][stakeIndex].stakedAmount == 0) {\\n _claimReward(_msgSender(), stakeIndex);\\n\\n userStakingInfo[_msgSender()][stakeIndex] = userStakingInfo[_msgSender()][\\n userStakingInfo[_msgSender()].length - 1\\n ];\\n userStakingInfo[_msgSender()].pop();\\n }\\n stakeRewardToken.safeTransfer(_msgSender(), amount);\\n\\n emit Unstaked(_msgSender(), stakeIndex, amount);\\n }\\n\\n /**\\n * @notice Claim pending rewards.\\n * @dev Emits a `RewardPaid` event upon successful reward claim.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function getReward(uint256 stakeIndex) external nonReentrant notBlacklisted(_msgSender()) {\\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \\\"invalid stakeIndex\\\");\\n _updateReward(_msgSender(), stakeIndex);\\n _claimReward(_msgSender(), stakeIndex);\\n }\\n\\n // --------------------\\n // ADMIN CONFIGURATION\\n // --------------------\\n\\n /**\\n * @notice Update Rewards Duration.\\n * @dev Only callable by owner, and setting available only after rewards period.\\n * @param duration The nmew rewards duration in seconds.\\n */\\n function setRewardsDuration(uint256 duration) external onlyOwner {\\n require(finishAt < block.timestamp, \\\"reward duration is not finished\\\");\\n rewardsDuration = duration;\\n }\\n\\n /**\\n * @notice Notify the contract about the amount of rewards to be distributed and update reward parameters.\\n * @dev Only callable by owner.\\n * @param amount The amount of reward to be distributed.\\n */\\n function notifyRewardAmount(uint256 amount) external onlyOwner {\\n require(rewardsDuration > 0, \\\"rewards duration is not set\\\");\\n require(amount > 0, \\\"amount = 0\\\");\\n\\n _updateReward(address(0), 0);\\n\\n if (block.timestamp >= finishAt) {\\n rewardRatePerSec = amount / rewardsDuration;\\n } else {\\n uint256 remainingRewards = (finishAt - block.timestamp) * rewardRatePerSec;\\n rewardRatePerSec = (amount + remainingRewards) / rewardsDuration;\\n }\\n\\n require(rewardRatePerSec > 0, \\\"reward rate = 0\\\");\\n require(\\n rewardRatePerSec <=\\n (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) /\\n rewardsDuration,\\n \\\"reward amount > balance\\\"\\n );\\n\\n finishAt = block.timestamp + rewardsDuration;\\n lastUpdateTime = block.timestamp;\\n\\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\\n\\n emit NotifiedRewardAmount(amount, rewardRatePerSec);\\n }\\n\\n // --------------------\\n // VIEW FUNCTIONS\\n // --------------------\\n\\n /**\\n * @notice Get the last time when rewards were applicable for the specified reward token.\\n * @return Timestamp of the most recent rewards calculation.\\n */\\n function lastTimeRewardApplicable() public view returns (uint256) {\\n return _min(finishAt, block.timestamp);\\n }\\n\\n /**\\n * @notice Calculate the reward per token for a given reward token.\\n * @return Current reward per token.\\n */\\n function rewardPerToken() public view returns (uint256) {\\n if (totalStaked == 0) {\\n return rewardPerTokenStored;\\n }\\n\\n return\\n rewardPerTokenStored +\\n (rewardRatePerSec * (lastTimeRewardApplicable() - lastUpdateTime) * 1e18) /\\n totalStaked;\\n }\\n\\n /**\\n * @notice Calculate the user's stake pool earnings\\n * @param account Address of the user.\\n * @param stakeIndex Index of the stakePool\\n * @return Return earned amounts\\n */\\n function earned(address account, uint256 stakeIndex) public view returns (uint256) {\\n StakingInfo memory userInfo = userStakingInfo[account][stakeIndex];\\n uint256 rewardsSinceLastUpdate = ((userInfo.stakedAmount *\\n (rewardPerToken() - userInfo.rewardPerTokenPaid)) / 1e18);\\n return rewardsSinceLastUpdate + userInfo.rewards;\\n }\\n\\n /**\\n * @notice Get the earned rewards array for a user.\\n * @param account Address of the user.\\n * @return Return earned rewards array for a user.\\n */\\n function getEarnedUser(address account) public view returns (uint256[] memory) {\\n uint256 numberOfPools = userStakingInfo[account].length;\\n uint256[] memory earnedArray = new uint256[](numberOfPools);\\n for (uint256 index; index < numberOfPools; index++) {\\n earnedArray[index] = earned(account, index);\\n }\\n return earnedArray;\\n }\\n\\n /**\\n * @dev tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n\\n /**\\n * @notice Get User Stake Data.\\n * @param account The address of user.\\n * @return StakingInfo array.\\n */\\n function getUserStakes(address account) external view returns (StakingInfo[] memory) {\\n return userStakingInfo[account];\\n }\\n\\n /**\\n * @notice Send rewards to user.\\n * @dev This is private function, called by getReward function.\\n * @param account The address of user.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function _claimReward(address account, uint256 stakeIndex) private {\\n uint256 reward = userStakingInfo[account][stakeIndex].rewards;\\n\\n if (reward > 0) {\\n userStakingInfo[account][stakeIndex].rewards = 0;\\n stakeRewardToken.safeTransfer(account, reward);\\n emit RewardPaid(account, stakeIndex, reward);\\n }\\n }\\n\\n /**\\n * @notice Calculate and update user rewards per stakeIndex.\\n * @dev this is private function, called by stake, unstake, getRewards, and notifyRewardAmount functions.\\n * @param account The address of user.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function _updateReward(address account, uint256 stakeIndex) private {\\n rewardPerTokenStored = rewardPerToken();\\n lastUpdateTime = lastTimeRewardApplicable();\\n\\n if (account != address(0)) {\\n userStakingInfo[account][stakeIndex].rewards = earned(account, stakeIndex);\\n userStakingInfo[account][stakeIndex].rewardPerTokenPaid = rewardPerTokenStored;\\n }\\n }\\n\\n /**\\n * @notice Take minimum value between x and y.\\n */\\n function _min(uint256 x, uint256 y) private pure returns (uint256) {\\n return x <= y ? x : y;\\n }\\n}\\n\",\"keccak256\":\"0x6e88a76db16dc5ad8717fd3cbedfda69d4537ed8b767e8765b8ce00668810b01\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalPausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalPause} from \\\"../GlobalPause.sol\\\";\\n\\n/**\\n * @title GlobalPausableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\\n * contract (see GlobalPause.sol). This design facilitates centralized management of\\n * pause state for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure\\n * The _globalPause state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalPausableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\\n /**\\n * @notice The GlobalPause contract the pause state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalPause private _globalPause;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalPause_ The address of the GlobalPause contract.\\n */\\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n }\\n\\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\\n _globalPause = GlobalPause(globalPause_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalPause contract.\\n * @return The address of the GlobalPause contract.\\n */\\n function globalPause() public view returns (address) {\\n return address(_globalPause);\\n }\\n\\n /**\\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\\n * from the GlobalPause contract instead.\\n * @return Whether the contract is paused or not.\\n */\\n function paused() public view virtual override returns (bool) {\\n return _globalPause.paused();\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xff508c0b8c48916885453b4894d0401e94580fb24fb6af1885a3e160864cde94\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalRestrictableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalBlacklist} from \\\"../GlobalBlacklist.sol\\\";\\n\\n/**\\n * @title GlobalRestrictableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a blacklist state from the specified\\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\\n * centralized management of a blacklist for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalBlacklist state must be set at initialization time and, for evident\\n * security reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalRestrictableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalRestrictableUpgradeable is Initializable {\\n /**\\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalBlacklist private _globalBlacklist;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n }\\n\\n function __GlobalRestrictable_init_unchained(\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalBlacklist contract.\\n * @return The address of the GlobalBlacklist contract.\\n */\\n function globalBlacklist() public view returns (address) {\\n return address(_globalBlacklist);\\n }\\n\\n /**\\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n */\\n modifier notBlacklisted(address account) {\\n require(isBlacklisted(account) == false, \\\"L9\\\");\\n _;\\n }\\n\\n /**\\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n * @return Whether the account is blacklisted.\\n */\\n function isBlacklisted(address account) internal view returns (bool) {\\n return _globalBlacklist.isBlacklisted(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x0032fde90d9cf23e70dd4b604ae0d1ed3283f117bc24f68d32f8933e1bd372bc\",\"license\":\"MIT\"},\"contracts/src/abstracts/RecoverableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Conracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title RecoverableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with helper functions allowing the recovery of\\n * assets accidentally sent to them.\\n *\\n * @dev Where are utilities Ether, ERC721, etc.?\\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\\n * in this codebase currently do not implement the necessary functions to receive Ether\\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\\n *\\n * @dev For further details, see \\\"RecoverableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init(globalOwner_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Recoverable_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Recovers a specified amount of a given token address. Will fail if the\\n * contract doesn't hold enough tokens.\\n * @param tokenAddress The address of the token to recover.\\n * @param amount The amount of token to recover.\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\\n // Ensure the specified amount is not zero\\n require(amount > 0, \\\"L10\\\");\\n\\n // Create a reference to token's contract\\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\\n\\n // Ensure there is enough token to recover\\n require(tokenContract.balanceOf(address(this)) >= amount, \\\"L11\\\");\\n\\n // Transfer the recovered token amount to the sender\\n tokenContract.safeTransfer(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xc70110d1284c9e4aa7c518b3b98682dd9edbe6f6fb23761d825554ba41a80d5e\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"../GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"../GlobalRestrictableUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../RecoverableUpgradeable.sol\\\";\\n\\n/**\\n * @title BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\\n * minimizing code repetition and enhancing readability and maintainability.\\n *\\n * @dev For further details, see \\\"Base\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract BaseUpgradeable is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n GlobalPausableUpgradeable,\\n GlobalRestrictableUpgradeable,\\n RecoverableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xe445c759682f31d39e63663ff8217072c0e81086bda11ea473247be334c3e424\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000030565b6200002a62000030565b620000f1565b600054610100900460ff16156200009d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000ef576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051612c3562000129600039600081816109ab015281816109eb01528181610dd901528181610e190152610ea80152612c356000f3fe6080604052600436106102045760003560e01c80638980f11f11610118578063cc1a378f116100a0578063df136d651161006f578063df136d65146105c6578063f12d54d8146105dd578063f2fde38b146105fc578063f6c356501461061c578063f762e7341461063d57600080fd5b8063cc1a378f1461055a578063cd3daf9d1461057a578063cedaf6391461058f578063de3e3eff146105a657600080fd5b80639e2c8a5b116100e75780639e2c8a5b146104bb578063bddff592146104db578063c66120f4146104f2578063c8f33c9114610523578063c8f74bb81461053a57600080fd5b80638980f11f1461044f5780638da5cb5b1461046f57806398645a1f146104845780639b602f0a146104a457600080fd5b806352d1902d1161019b5780637b2cca381161016a5780637b2cca38146103965780637c2edb16146103c357806380faa57d146103f6578063817b1cd21461040b578063842e29811461042257600080fd5b806352d1902d146103305780635c975abb1461034557806367d3b4881461036a578063715018a61461038157600080fd5b8063386a9525116101d7578063386a9525146102b85780633c6b16ab146102dd5780633e491d47146102fd5780634f1ef2861461031d57600080fd5b806304d978f11461020957806310087fb1146102565780631c4b774b146102785780633659cfe614610298575b600080fd5b34801561021557600080fd5b506102296102243660046125b0565b61065b565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b34801561026257600080fd5b506102766102713660046125dc565b6106aa565b005b34801561028457600080fd5b50610276610293366004612612565b6108ee565b3480156102a457600080fd5b506102766102b336600461262b565b6109a1565b3480156102c457600080fd5b506102cf61022e5481565b60405190815260200161024d565b3480156102e957600080fd5b506102766102f8366004612612565b610a7d565b34801561030957600080fd5b506102cf6103183660046125b0565b610cff565b61027661032b36600461268f565b610dcf565b34801561033c57600080fd5b506102cf610e9b565b34801561035157600080fd5b5061035a610f4e565b604051901515815260200161024d565b34801561037657600080fd5b506102cf61022f5481565b34801561038d57600080fd5b50610276610fc2565b3480156103a257600080fd5b506103b66103b136600461262b565b610ff8565b60405161024d9190612737565b3480156103cf57600080fd5b50610161546001600160a01b03165b6040516001600160a01b03909116815260200161024d565b34801561040257600080fd5b506102cf6110a6565b34801561041757600080fd5b506102cf6102335481565b34801561042e57600080fd5b5061044261043d36600461262b565b6110b5565b60405161024d919061277b565b34801561045b57600080fd5b5061027661046a3660046125b0565b61115d565b34801561047b57600080fd5b506103de611254565b34801561049057600080fd5b5061027661049f3660046127e9565b6112c2565b3480156104b057600080fd5b506102cf61022c5481565b3480156104c757600080fd5b506102766104d63660046128ee565b61141a565b3480156104e757600080fd5b506102cf6102315481565b3480156104fe57600080fd5b5061035a61050d36600461262b565b6102356020526000908152604090205460ff1681565b34801561052f57600080fd5b506102cf6102305481565b34801561054657600080fd5b506102cf61055536600461262b565b6118aa565b34801561056657600080fd5b50610276610575366004612612565b6118dc565b34801561058657600080fd5b506102cf61193c565b34801561059b57600080fd5b506102cf61022b5481565b3480156105b257600080fd5b506102cf6105c1366004612612565b6119a3565b3480156105d257600080fd5b506102cf6102325481565b3480156105e957600080fd5b5061012e546001600160a01b03166103de565b34801561060857600080fd5b5061027661061736600461262b565b6119c5565b34801561062857600080fd5b5061022a546103de906001600160a01b031681565b34801561064957600080fd5b5060fb546001600160a01b03166103de565b610234602052816000526040600020818154811061067857600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6106b26119fa565b6106ba611a55565b336106c481611a9f565b156106ea5760405162461bcd60e51b81526004016106e190612910565b60405180910390fd5b6000831161070a5760405162461bcd60e51b81526004016106e19061292c565b61022d5461071a90600190612966565b8260ff1611156107655760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a59081cdd185ada5b99c81c195c9a5bd960521b60448201526064016106e1565b610770600080611b0f565b600061022d8360ff168154811061078957610789612979565b9060005260206000200154905060006040518060a0016040528086815260200183426107b5919061298f565b81526020018381526020016102325481526020016000815250905061022b5482101580156107e6575061022c548510155b156108075733600090815261023560205260409020805460ff191660011790555b33600081815261023460209081526040808320805460018082018355828652848620885160059093020191825593870151818501559186015160028301556060860151600383015560808601516004909201919091559282529154909161086d91612966565b9050856102336000828254610882919061298f565b909155505061022a546108a0906001600160a01b0316333089611bd4565b604080518281526020810188905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a2505050506108ea60016101f855565b5050565b6108f66119fa565b3361090081611a9f565b1561091d5760405162461bcd60e51b81526004016106e190612910565b61092882600161298f565b3360009081526102346020526040902054101561097c5760405162461bcd60e51b81526020600482015260126024820152710d2dcecc2d8d2c840e6e8c2d6ca92dcc8caf60731b60448201526064016106e1565b610987335b83611b0f565b610992335b83611c45565b5061099e60016101f855565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109e95760405162461bcd60e51b81526004016106e1906129a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a32600080516020612bb9833981519152546001600160a01b031690565b6001600160a01b031614610a585760405162461bcd60e51b81526004016106e1906129ee565b610a6181611d2d565b6040805160008082526020820190925261099e91839190611d35565b610a85611ea0565b600061022e5411610ad85760405162461bcd60e51b815260206004820152601b60248201527f72657761726473206475726174696f6e206973206e6f7420736574000000000060448201526064016106e1565b60008111610af85760405162461bcd60e51b81526004016106e19061292c565b610b03600080611b0f565b61022f544210610b245761022e54610b1b9082612a3a565b61023155610b64565b6000610231544261022f54610b399190612966565b610b439190612a5c565b61022e54909150610b54828461298f565b610b5e9190612a3a565b61023155505b60006102315411610ba95760405162461bcd60e51b815260206004820152600f60248201526e07265776172642072617465203d203608c1b60448201526064016106e1565b61022e546102335461022a546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190612a73565b610c28919061298f565b610c329190612966565b610c3c9190612a3a565b610231541115610c8e5760405162461bcd60e51b815260206004820152601760248201527f72657761726420616d6f756e74203e2062616c616e636500000000000000000060448201526064016106e1565b61022e54610c9c904261298f565b61022f554261023055610cbe3361022a546001600160a01b0316903084611bd4565b610231546040805183815260208101929092527fc3ed9e2a55e03c1173986e2799c70b4a5654ed43739f79f1ad3833683dad9f7f910160405180910390a150565b6001600160a01b038216600090815261023460205260408120805482919084908110610d2d57610d2d612979565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000670de0b6b3a76400008260600151610d9261193c565b610d9c9190612966565b8351610da89190612a5c565b610db29190612a3a565b9050816080015181610dc4919061298f565b925050505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e175760405162461bcd60e51b81526004016106e1906129a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e60600080516020612bb9833981519152546001600160a01b031690565b6001600160a01b031614610e865760405162461bcd60e51b81526004016106e1906129ee565b610e8f82611d2d565b6108ea82826001611d35565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106e1565b50600080516020612bb983398151915290565b61012e5460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612a8c565b905090565b610fca611ea0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016106e1565b6001600160a01b038116600090815261023460205260408120546060918167ffffffffffffffff81111561102e5761102e612648565b604051908082528060200260200182016040528015611057578160200160208202803683370190505b50905060005b8281101561109e5761106f8582610cff565b82828151811061108157611081612979565b60209081029190910101528061109681612aae565b91505061105d565b509392505050565b6000610fbd61022f5442611eff565b6001600160a01b038116600090815261023460209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561115257838290600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050815260200190600101906110ee565b505050509050919050565b611165611ea0565b6000811161119b5760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b60448201526064016106e1565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190612a73565b101561123b5760405162461bcd60e51b81526020600482015260036024820152624c313160e81b60448201526064016106e1565b61124f6001600160a01b0382163384611f18565b505050565b60fb5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612ac7565b600054610100900460ff16158080156112e25750600054600160ff909116105b806112fc5750303b1580156112fc575060005460ff166001145b61135f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e1565b6000805460ff191660011790558015611382576000805461ff0019166101001790555b61138d888888611f48565b61022a80546001600160a01b0319166001600160a01b03871617905583516113bd9061022d90602087019061253b565b5061022b83905561022c8290558015611410576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6114226119fa565b3361142c81611a9f565b156114495760405162461bcd60e51b81526004016106e190612910565b600083116114695760405162461bcd60e51b81526004016106e19061292c565b61147482600161298f565b336000908152610234602052604090205410156114c85760405162461bcd60e51b81526020600482015260126024820152710d2dcecc2d8d2c840e6e8c2d6ca92dcc8caf60731b60448201526064016106e1565b336000908152610234602052604090208054839081106114ea576114ea612979565b90600052602060002090600502016001015442101561155f5760405162461bcd60e51b815260206004820152602b60248201527f6e6f7420616c6c6f77656420756e7374616b696e6720696e207468652073746160448201526a1ada5b99c81c195c9a5bd960aa1b60648201526084016106e1565b3360009081526102346020526040902080548390811061158157611581612979565b9060005260206000209060050201600001548311156115d85760405162461bcd60e51b81526020600482015260136024820152721a5b9cdd59999a58da595b9d08185b5bdd5b9d606a1b60448201526064016106e1565b6115e133610981565b8261023360008282546115f49190612966565b90915550503360009081526102346020526040902080548491908490811061161e5761161e612979565b9060005260206000209060050201600001600082825461163e9190612966565b909155505061022b543360009081526102346020526040902080548490811061166957611669612979565b906000526020600020906005020160020154101580156116be575061022c54336000908152610234602052604090208054849081106116aa576116aa612979565b906000526020600020906005020160000154105b156116dc5733600090815261023560205260409020805460ff191690555b336000908152610234602052604090208054839081106116fe576116fe612979565b90600052602060002090600502016000015460000361184b576117203361098c565b33600090815261023460205260409020805461173e90600190612966565b8154811061174e5761174e612979565b906000526020600020906005020161023460006117683390565b6001600160a01b03166001600160a01b03168152602001908152602001600020838154811061179957611799612979565b9060005260206000209060050201600082015481600001556001820154816001015560028201548160020155600382015481600301556004820154816004015590505061023460006117e83390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548061181757611817612ae4565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555b6118633361022a546001600160a01b03169085611f18565b604080518381526020810185905233917f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e910160405180910390a2506108ea60016101f855565b6001600160a01b0381166000908152610235602052604081205460ff16156118d457506003919050565b506000919050565b6118e4611ea0565b4261022f54106119365760405162461bcd60e51b815260206004820152601f60248201527f726577617264206475726174696f6e206973206e6f742066696e69736865640060448201526064016106e1565b61022e55565b60006102335460000361195157506102325490565b61023354610230546119616110a6565b61196b9190612966565b610231546119799190612a5c565b61198b90670de0b6b3a7640000612a5c565b6119959190612a3a565b61023254610fbd919061298f565b61022d81815481106119b457600080fd5b600091825260209091200154905081565b6119cd611ea0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016106e1565b60026101f85403611a4d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106e1565b60026101f855565b611a5d610f4e565b15611a9d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106e1565b565b6101615460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa158015611aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc99190612a8c565b611b1761193c565b61023255611b236110a6565b610230556001600160a01b038216156108ea57611b408282610cff565b6001600160a01b038316600090815261023460205260409020805483908110611b6b57611b6b612979565b906000526020600020906005020160040181905550610232546102346000846001600160a01b03166001600160a01b031681526020019081526020016000208281548110611bbb57611bbb612979565b9060005260206000209060050201600301819055505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611c3f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fa2565b50505050565b6001600160a01b038216600090815261023460205260408120805483908110611c7057611c70612979565b9060005260206000209060050201600401549050600081111561124f576001600160a01b038316600090815261023460205260408120805484908110611cb857611cb8612979565b600091825260209091206004600590920201015561022a54611ce4906001600160a01b03168483611f18565b60408051838152602081018390526001600160a01b038516917fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51910160405180910390a2505050565b61099e611ea0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611d685761124f83612077565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611dc2575060408051601f3d908101601f19168201909252611dbf91810190612a73565b60015b611e255760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106e1565b600080516020612bb98339815191528114611e945760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106e1565b5061124f838383612113565b33611ea9611254565b6001600160a01b031614611a9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e1565b600081831115611f0f5781611f11565b825b9392505050565b6040516001600160a01b03831660248201526044810182905261124f90849063a9059cbb60e01b90606401611c08565b600054610100900460ff16611f6f5760405162461bcd60e51b81526004016106e190612afa565b611f77612138565b611f808361215f565b611f8861218f565b611f91826121be565b611f9a81612208565b61124f612138565b6000611ff7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122529092919063ffffffff16565b90508051600014806120185750808060200190518101906120189190612a8c565b61124f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106e1565b6001600160a01b0381163b6120e45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106e1565b600080516020612bb983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61211c83612269565b6000825111806121295750805b1561124f57611c3f83836122a9565b600054610100900460ff16611a9d5760405162461bcd60e51b81526004016106e190612afa565b600054610100900460ff166121865760405162461bcd60e51b81526004016106e190612afa565b61099e816122ce565b600054610100900460ff166121b65760405162461bcd60e51b81526004016106e190612afa565b611a9d612317565b600054610100900460ff166121e55760405162461bcd60e51b81526004016106e190612afa565b61012e80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1661222f5760405162461bcd60e51b81526004016106e190612afa565b61016180546001600160a01b0319166001600160a01b0392909216919091179055565b6060612261848460008561234a565b949350505050565b61227281612077565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611f118383604051806060016040528060278152602001612bd960279139612425565b600054610100900460ff166122f55760405162461bcd60e51b81526004016106e190612afa565b60fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1661233e5760405162461bcd60e51b81526004016106e190612afa565b6097805460ff19169055565b6060824710156123ab5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106e1565b600080866001600160a01b031685876040516123c79190612b69565b60006040518083038185875af1925050503d8060008114612404576040519150601f19603f3d011682016040523d82523d6000602084013e612409565b606091505b509150915061241a8783838761249d565b979650505050505050565b6060600080856001600160a01b0316856040516124429190612b69565b600060405180830381855af49150503d806000811461247d576040519150601f19603f3d011682016040523d82523d6000602084013e612482565b606091505b50915091506124938683838761249d565b9695505050505050565b6060831561250c578251600003612505576001600160a01b0385163b6125055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106e1565b5081612261565b61226183838151156125215781518083602001fd5b8060405162461bcd60e51b81526004016106e19190612b85565b828054828255906000526020600020908101928215612576579160200282015b8281111561257657825182559160200191906001019061255b565b50612582929150612586565b5090565b5b808211156125825760008155600101612587565b6001600160a01b038116811461099e57600080fd5b600080604083850312156125c357600080fd5b82356125ce8161259b565b946020939093013593505050565b600080604083850312156125ef57600080fd5b82359150602083013560ff8116811461260757600080fd5b809150509250929050565b60006020828403121561262457600080fd5b5035919050565b60006020828403121561263d57600080fd5b8135611f118161259b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561268757612687612648565b604052919050565b600080604083850312156126a257600080fd5b82356126ad8161259b565b915060208381013567ffffffffffffffff808211156126cb57600080fd5b818601915086601f8301126126df57600080fd5b8135818111156126f1576126f1612648565b612703601f8201601f1916850161265e565b9150808252878482850101111561271957600080fd5b80848401858401376000848284010152508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561276f57835183529284019291840191600101612753565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127dc5781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101612798565b5091979650505050505050565b600080600080600080600060e0888a03121561280457600080fd5b873561280f8161259b565b96506020888101356128208161259b565b965060408901356128308161259b565b955060608901356128408161259b565b9450608089013567ffffffffffffffff8082111561285d57600080fd5b818b0191508b601f83011261287157600080fd5b81358181111561288357612883612648565b8060051b915061289484830161265e565b818152918301840191848101908e8411156128ae57600080fd5b938501935b838510156128cc578435825293850193908501906128b3565b9b9e9a9d50989b979a9960a0890135995060c090980135979650505050505050565b6000806040838503121561290157600080fd5b50508035926020909101359150565b6020808252600290820152614c3960f01b604082015260600190565b6020808252600a90820152690616d6f756e74203d20360b41b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dc957610dc9612950565b634e487b7160e01b600052603260045260246000fd5b80820180821115610dc957610dc9612950565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082612a5757634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610dc957610dc9612950565b600060208284031215612a8557600080fd5b5051919050565b600060208284031215612a9e57600080fd5b81518015158114611f1157600080fd5b600060018201612ac057612ac0612950565b5060010190565b600060208284031215612ad957600080fd5b8151611f118161259b565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015612b60578181015183820152602001612b48565b50506000910152565b60008251612b7b818460208701612b45565b9190910192915050565b6020815260008251806020840152612ba4816040850160208701612b45565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209d0c2da28201e00f0a099670d6cddc88ea1d0d195ca6e1cafdd63f2676dc78ed64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106102045760003560e01c80638980f11f11610118578063cc1a378f116100a0578063df136d651161006f578063df136d65146105c6578063f12d54d8146105dd578063f2fde38b146105fc578063f6c356501461061c578063f762e7341461063d57600080fd5b8063cc1a378f1461055a578063cd3daf9d1461057a578063cedaf6391461058f578063de3e3eff146105a657600080fd5b80639e2c8a5b116100e75780639e2c8a5b146104bb578063bddff592146104db578063c66120f4146104f2578063c8f33c9114610523578063c8f74bb81461053a57600080fd5b80638980f11f1461044f5780638da5cb5b1461046f57806398645a1f146104845780639b602f0a146104a457600080fd5b806352d1902d1161019b5780637b2cca381161016a5780637b2cca38146103965780637c2edb16146103c357806380faa57d146103f6578063817b1cd21461040b578063842e29811461042257600080fd5b806352d1902d146103305780635c975abb1461034557806367d3b4881461036a578063715018a61461038157600080fd5b8063386a9525116101d7578063386a9525146102b85780633c6b16ab146102dd5780633e491d47146102fd5780634f1ef2861461031d57600080fd5b806304d978f11461020957806310087fb1146102565780631c4b774b146102785780633659cfe614610298575b600080fd5b34801561021557600080fd5b506102296102243660046125b0565b61065b565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b34801561026257600080fd5b506102766102713660046125dc565b6106aa565b005b34801561028457600080fd5b50610276610293366004612612565b6108ee565b3480156102a457600080fd5b506102766102b336600461262b565b6109a1565b3480156102c457600080fd5b506102cf61022e5481565b60405190815260200161024d565b3480156102e957600080fd5b506102766102f8366004612612565b610a7d565b34801561030957600080fd5b506102cf6103183660046125b0565b610cff565b61027661032b36600461268f565b610dcf565b34801561033c57600080fd5b506102cf610e9b565b34801561035157600080fd5b5061035a610f4e565b604051901515815260200161024d565b34801561037657600080fd5b506102cf61022f5481565b34801561038d57600080fd5b50610276610fc2565b3480156103a257600080fd5b506103b66103b136600461262b565b610ff8565b60405161024d9190612737565b3480156103cf57600080fd5b50610161546001600160a01b03165b6040516001600160a01b03909116815260200161024d565b34801561040257600080fd5b506102cf6110a6565b34801561041757600080fd5b506102cf6102335481565b34801561042e57600080fd5b5061044261043d36600461262b565b6110b5565b60405161024d919061277b565b34801561045b57600080fd5b5061027661046a3660046125b0565b61115d565b34801561047b57600080fd5b506103de611254565b34801561049057600080fd5b5061027661049f3660046127e9565b6112c2565b3480156104b057600080fd5b506102cf61022c5481565b3480156104c757600080fd5b506102766104d63660046128ee565b61141a565b3480156104e757600080fd5b506102cf6102315481565b3480156104fe57600080fd5b5061035a61050d36600461262b565b6102356020526000908152604090205460ff1681565b34801561052f57600080fd5b506102cf6102305481565b34801561054657600080fd5b506102cf61055536600461262b565b6118aa565b34801561056657600080fd5b50610276610575366004612612565b6118dc565b34801561058657600080fd5b506102cf61193c565b34801561059b57600080fd5b506102cf61022b5481565b3480156105b257600080fd5b506102cf6105c1366004612612565b6119a3565b3480156105d257600080fd5b506102cf6102325481565b3480156105e957600080fd5b5061012e546001600160a01b03166103de565b34801561060857600080fd5b5061027661061736600461262b565b6119c5565b34801561062857600080fd5b5061022a546103de906001600160a01b031681565b34801561064957600080fd5b5060fb546001600160a01b03166103de565b610234602052816000526040600020818154811061067857600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6106b26119fa565b6106ba611a55565b336106c481611a9f565b156106ea5760405162461bcd60e51b81526004016106e190612910565b60405180910390fd5b6000831161070a5760405162461bcd60e51b81526004016106e19061292c565b61022d5461071a90600190612966565b8260ff1611156107655760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a59081cdd185ada5b99c81c195c9a5bd960521b60448201526064016106e1565b610770600080611b0f565b600061022d8360ff168154811061078957610789612979565b9060005260206000200154905060006040518060a0016040528086815260200183426107b5919061298f565b81526020018381526020016102325481526020016000815250905061022b5482101580156107e6575061022c548510155b156108075733600090815261023560205260409020805460ff191660011790555b33600081815261023460209081526040808320805460018082018355828652848620885160059093020191825593870151818501559186015160028301556060860151600383015560808601516004909201919091559282529154909161086d91612966565b9050856102336000828254610882919061298f565b909155505061022a546108a0906001600160a01b0316333089611bd4565b604080518281526020810188905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a2505050506108ea60016101f855565b5050565b6108f66119fa565b3361090081611a9f565b1561091d5760405162461bcd60e51b81526004016106e190612910565b61092882600161298f565b3360009081526102346020526040902054101561097c5760405162461bcd60e51b81526020600482015260126024820152710d2dcecc2d8d2c840e6e8c2d6ca92dcc8caf60731b60448201526064016106e1565b610987335b83611b0f565b610992335b83611c45565b5061099e60016101f855565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109e95760405162461bcd60e51b81526004016106e1906129a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a32600080516020612bb9833981519152546001600160a01b031690565b6001600160a01b031614610a585760405162461bcd60e51b81526004016106e1906129ee565b610a6181611d2d565b6040805160008082526020820190925261099e91839190611d35565b610a85611ea0565b600061022e5411610ad85760405162461bcd60e51b815260206004820152601b60248201527f72657761726473206475726174696f6e206973206e6f7420736574000000000060448201526064016106e1565b60008111610af85760405162461bcd60e51b81526004016106e19061292c565b610b03600080611b0f565b61022f544210610b245761022e54610b1b9082612a3a565b61023155610b64565b6000610231544261022f54610b399190612966565b610b439190612a5c565b61022e54909150610b54828461298f565b610b5e9190612a3a565b61023155505b60006102315411610ba95760405162461bcd60e51b815260206004820152600f60248201526e07265776172642072617465203d203608c1b60448201526064016106e1565b61022e546102335461022a546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190612a73565b610c28919061298f565b610c329190612966565b610c3c9190612a3a565b610231541115610c8e5760405162461bcd60e51b815260206004820152601760248201527f72657761726420616d6f756e74203e2062616c616e636500000000000000000060448201526064016106e1565b61022e54610c9c904261298f565b61022f554261023055610cbe3361022a546001600160a01b0316903084611bd4565b610231546040805183815260208101929092527fc3ed9e2a55e03c1173986e2799c70b4a5654ed43739f79f1ad3833683dad9f7f910160405180910390a150565b6001600160a01b038216600090815261023460205260408120805482919084908110610d2d57610d2d612979565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000670de0b6b3a76400008260600151610d9261193c565b610d9c9190612966565b8351610da89190612a5c565b610db29190612a3a565b9050816080015181610dc4919061298f565b925050505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e175760405162461bcd60e51b81526004016106e1906129a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e60600080516020612bb9833981519152546001600160a01b031690565b6001600160a01b031614610e865760405162461bcd60e51b81526004016106e1906129ee565b610e8f82611d2d565b6108ea82826001611d35565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106e1565b50600080516020612bb983398151915290565b61012e5460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612a8c565b905090565b610fca611ea0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016106e1565b6001600160a01b038116600090815261023460205260408120546060918167ffffffffffffffff81111561102e5761102e612648565b604051908082528060200260200182016040528015611057578160200160208202803683370190505b50905060005b8281101561109e5761106f8582610cff565b82828151811061108157611081612979565b60209081029190910101528061109681612aae565b91505061105d565b509392505050565b6000610fbd61022f5442611eff565b6001600160a01b038116600090815261023460209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561115257838290600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050815260200190600101906110ee565b505050509050919050565b611165611ea0565b6000811161119b5760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b60448201526064016106e1565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190612a73565b101561123b5760405162461bcd60e51b81526020600482015260036024820152624c313160e81b60448201526064016106e1565b61124f6001600160a01b0382163384611f18565b505050565b60fb5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612ac7565b600054610100900460ff16158080156112e25750600054600160ff909116105b806112fc5750303b1580156112fc575060005460ff166001145b61135f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e1565b6000805460ff191660011790558015611382576000805461ff0019166101001790555b61138d888888611f48565b61022a80546001600160a01b0319166001600160a01b03871617905583516113bd9061022d90602087019061253b565b5061022b83905561022c8290558015611410576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6114226119fa565b3361142c81611a9f565b156114495760405162461bcd60e51b81526004016106e190612910565b600083116114695760405162461bcd60e51b81526004016106e19061292c565b61147482600161298f565b336000908152610234602052604090205410156114c85760405162461bcd60e51b81526020600482015260126024820152710d2dcecc2d8d2c840e6e8c2d6ca92dcc8caf60731b60448201526064016106e1565b336000908152610234602052604090208054839081106114ea576114ea612979565b90600052602060002090600502016001015442101561155f5760405162461bcd60e51b815260206004820152602b60248201527f6e6f7420616c6c6f77656420756e7374616b696e6720696e207468652073746160448201526a1ada5b99c81c195c9a5bd960aa1b60648201526084016106e1565b3360009081526102346020526040902080548390811061158157611581612979565b9060005260206000209060050201600001548311156115d85760405162461bcd60e51b81526020600482015260136024820152721a5b9cdd59999a58da595b9d08185b5bdd5b9d606a1b60448201526064016106e1565b6115e133610981565b8261023360008282546115f49190612966565b90915550503360009081526102346020526040902080548491908490811061161e5761161e612979565b9060005260206000209060050201600001600082825461163e9190612966565b909155505061022b543360009081526102346020526040902080548490811061166957611669612979565b906000526020600020906005020160020154101580156116be575061022c54336000908152610234602052604090208054849081106116aa576116aa612979565b906000526020600020906005020160000154105b156116dc5733600090815261023560205260409020805460ff191690555b336000908152610234602052604090208054839081106116fe576116fe612979565b90600052602060002090600502016000015460000361184b576117203361098c565b33600090815261023460205260409020805461173e90600190612966565b8154811061174e5761174e612979565b906000526020600020906005020161023460006117683390565b6001600160a01b03166001600160a01b03168152602001908152602001600020838154811061179957611799612979565b9060005260206000209060050201600082015481600001556001820154816001015560028201548160020155600382015481600301556004820154816004015590505061023460006117e83390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548061181757611817612ae4565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555b6118633361022a546001600160a01b03169085611f18565b604080518381526020810185905233917f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e910160405180910390a2506108ea60016101f855565b6001600160a01b0381166000908152610235602052604081205460ff16156118d457506003919050565b506000919050565b6118e4611ea0565b4261022f54106119365760405162461bcd60e51b815260206004820152601f60248201527f726577617264206475726174696f6e206973206e6f742066696e69736865640060448201526064016106e1565b61022e55565b60006102335460000361195157506102325490565b61023354610230546119616110a6565b61196b9190612966565b610231546119799190612a5c565b61198b90670de0b6b3a7640000612a5c565b6119959190612a3a565b61023254610fbd919061298f565b61022d81815481106119b457600080fd5b600091825260209091200154905081565b6119cd611ea0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016106e1565b60026101f85403611a4d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106e1565b60026101f855565b611a5d610f4e565b15611a9d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106e1565b565b6101615460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa158015611aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc99190612a8c565b611b1761193c565b61023255611b236110a6565b610230556001600160a01b038216156108ea57611b408282610cff565b6001600160a01b038316600090815261023460205260409020805483908110611b6b57611b6b612979565b906000526020600020906005020160040181905550610232546102346000846001600160a01b03166001600160a01b031681526020019081526020016000208281548110611bbb57611bbb612979565b9060005260206000209060050201600301819055505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611c3f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fa2565b50505050565b6001600160a01b038216600090815261023460205260408120805483908110611c7057611c70612979565b9060005260206000209060050201600401549050600081111561124f576001600160a01b038316600090815261023460205260408120805484908110611cb857611cb8612979565b600091825260209091206004600590920201015561022a54611ce4906001600160a01b03168483611f18565b60408051838152602081018390526001600160a01b038516917fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51910160405180910390a2505050565b61099e611ea0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611d685761124f83612077565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611dc2575060408051601f3d908101601f19168201909252611dbf91810190612a73565b60015b611e255760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106e1565b600080516020612bb98339815191528114611e945760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106e1565b5061124f838383612113565b33611ea9611254565b6001600160a01b031614611a9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e1565b600081831115611f0f5781611f11565b825b9392505050565b6040516001600160a01b03831660248201526044810182905261124f90849063a9059cbb60e01b90606401611c08565b600054610100900460ff16611f6f5760405162461bcd60e51b81526004016106e190612afa565b611f77612138565b611f808361215f565b611f8861218f565b611f91826121be565b611f9a81612208565b61124f612138565b6000611ff7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122529092919063ffffffff16565b90508051600014806120185750808060200190518101906120189190612a8c565b61124f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106e1565b6001600160a01b0381163b6120e45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106e1565b600080516020612bb983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61211c83612269565b6000825111806121295750805b1561124f57611c3f83836122a9565b600054610100900460ff16611a9d5760405162461bcd60e51b81526004016106e190612afa565b600054610100900460ff166121865760405162461bcd60e51b81526004016106e190612afa565b61099e816122ce565b600054610100900460ff166121b65760405162461bcd60e51b81526004016106e190612afa565b611a9d612317565b600054610100900460ff166121e55760405162461bcd60e51b81526004016106e190612afa565b61012e80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1661222f5760405162461bcd60e51b81526004016106e190612afa565b61016180546001600160a01b0319166001600160a01b0392909216919091179055565b6060612261848460008561234a565b949350505050565b61227281612077565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611f118383604051806060016040528060278152602001612bd960279139612425565b600054610100900460ff166122f55760405162461bcd60e51b81526004016106e190612afa565b60fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1661233e5760405162461bcd60e51b81526004016106e190612afa565b6097805460ff19169055565b6060824710156123ab5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106e1565b600080866001600160a01b031685876040516123c79190612b69565b60006040518083038185875af1925050503d8060008114612404576040519150601f19603f3d011682016040523d82523d6000602084013e612409565b606091505b509150915061241a8783838761249d565b979650505050505050565b6060600080856001600160a01b0316856040516124429190612b69565b600060405180830381855af49150503d806000811461247d576040519150601f19603f3d011682016040523d82523d6000602084013e612482565b606091505b50915091506124938683838761249d565b9695505050505050565b6060831561250c578251600003612505576001600160a01b0385163b6125055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106e1565b5081612261565b61226183838151156125215781518083602001fd5b8060405162461bcd60e51b81526004016106e19190612b85565b828054828255906000526020600020908101928215612576579160200282015b8281111561257657825182559160200191906001019061255b565b50612582929150612586565b5090565b5b808211156125825760008155600101612587565b6001600160a01b038116811461099e57600080fd5b600080604083850312156125c357600080fd5b82356125ce8161259b565b946020939093013593505050565b600080604083850312156125ef57600080fd5b82359150602083013560ff8116811461260757600080fd5b809150509250929050565b60006020828403121561262457600080fd5b5035919050565b60006020828403121561263d57600080fd5b8135611f118161259b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561268757612687612648565b604052919050565b600080604083850312156126a257600080fd5b82356126ad8161259b565b915060208381013567ffffffffffffffff808211156126cb57600080fd5b818601915086601f8301126126df57600080fd5b8135818111156126f1576126f1612648565b612703601f8201601f1916850161265e565b9150808252878482850101111561271957600080fd5b80848401858401376000848284010152508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561276f57835183529284019291840191600101612753565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127dc5781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101612798565b5091979650505050505050565b600080600080600080600060e0888a03121561280457600080fd5b873561280f8161259b565b96506020888101356128208161259b565b965060408901356128308161259b565b955060608901356128408161259b565b9450608089013567ffffffffffffffff8082111561285d57600080fd5b818b0191508b601f83011261287157600080fd5b81358181111561288357612883612648565b8060051b915061289484830161265e565b818152918301840191848101908e8411156128ae57600080fd5b938501935b838510156128cc578435825293850193908501906128b3565b9b9e9a9d50989b979a9960a0890135995060c090980135979650505050505050565b6000806040838503121561290157600080fd5b50508035926020909101359150565b6020808252600290820152614c3960f01b604082015260600190565b6020808252600a90820152690616d6f756e74203d20360b41b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dc957610dc9612950565b634e487b7160e01b600052603260045260246000fd5b80820180821115610dc957610dc9612950565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082612a5757634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610dc957610dc9612950565b600060208284031215612a8557600080fd5b5051919050565b600060208284031215612a9e57600080fd5b81518015158114611f1157600080fd5b600060018201612ac057612ac0612950565b5060010190565b600060208284031215612ad957600080fd5b8151611f118161259b565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015612b60578181015183820152602001612b48565b50506000910152565b60008251612b7b818460208701612b45565b9190910192915050565b6020815260008251806020840152612ba4816040850160208701612b45565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209d0c2da28201e00f0a099670d6cddc88ea1d0d195ca6e1cafdd63f2676dc78ed64736f6c63430008120033", + "devdoc": { + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "This contract implements tierOf() function from LDYStaking as it's the only one the LToken contract relies on.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "NotifiedRewardAmount(uint256,uint256)": { + "params": { + "rewardAmount": "Reward amount added by admin.", + "rewardPerSec": "RewardRatePerSec updated." + } + }, + "Paused(address)": { + "details": "Emitted when the pause is triggered by `account`." + }, + "RewardPaid(address,uint256,uint256)": { + "params": { + "reward": "Reward token amount", + "stakeIndex": "User staking pool index", + "user": "User address" + } + }, + "Staked(address,uint256,uint256)": { + "params": { + "amount": "Staked amount", + "stakeIndex": "Latest index of user staking pool", + "user": "User address" + } + }, + "Unpaused(address)": { + "details": "Emitted when the pause is lifted by `account`." + }, + "Unstaked(address,uint256,uint256)": { + "params": { + "amount": "Staked amount", + "stakeIndex": "User staking pool index", + "user": "User address" + } + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor" + }, + "earned(address,uint256)": { + "params": { + "account": "Address of the user.", + "stakeIndex": "Index of the stakePool" + }, + "returns": { + "_0": "Return earned amounts" + } + }, + "getEarnedUser(address)": { + "params": { + "account": "Address of the user." + }, + "returns": { + "_0": "Return earned rewards array for a user." + } + }, + "getReward(uint256)": { + "details": "Emits a `RewardPaid` event upon successful reward claim.", + "params": { + "stakeIndex": "The index of user staking pool." + } + }, + "getUserStakes(address)": { + "params": { + "account": "The address of user." + }, + "returns": { + "_0": "StakingInfo array." + } + }, + "globalBlacklist()": { + "returns": { + "_0": "The address of the GlobalBlacklist contract." + } + }, + "globalOwner()": { + "returns": { + "_0": "The address of the GlobalOwner contract." + } + }, + "globalPause()": { + "returns": { + "_0": "The address of the GlobalPause contract." + } + }, + "initialize(address,address,address,address,uint256[],uint256,uint256)": { + "details": "This function is intended for setting initial values for the contract's state variables.", + "params": { + "globalBlacklist_": "The address of the GlobalBlacklist contract.", + "globalOwner_": "The address of the GlobalOwner contract.", + "globalPause_": "The address of the GlobalPause contract.", + "stakeAmountForPerks_": "Minimal staking amount for perks.", + "stakeDurationForPerks_": "Minimal staking duration for perks.", + "stakeDurations_": "Available Staking Durations.", + "stakeRewardToken_": "The address of stake and reward token(LDY token)." + } + }, + "lastTimeRewardApplicable()": { + "returns": { + "_0": "Timestamp of the most recent rewards calculation." + } + }, + "notifyRewardAmount(uint256)": { + "details": "Only callable by owner.", + "params": { + "amount": "The amount of reward to be distributed." + } + }, + "owner()": { + "returns": { + "_0": "The address of the owner" + } + }, + "paused()": { + "returns": { + "_0": "Whether the contract is paused or not." + } + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "recoverERC20(address,uint256)": { + "params": { + "amount": "The amount of token to recover.", + "tokenAddress": "The address of the token to recover." + } + }, + "rewardPerToken()": { + "returns": { + "_0": "Current reward per token." + } + }, + "setRewardsDuration(uint256)": { + "details": "Only callable by owner, and setting available only after rewards period.", + "params": { + "duration": "The nmew rewards duration in seconds." + } + }, + "stake(uint256,uint8)": { + "details": "Emits a `Staked` event upon successful staking.", + "params": { + "amount": "The amount of tokens to stake.", + "stakeDurationIndex": "The Index of stakeDurations array." + } + }, + "tierOf(address)": { + "details": "tierOf() function that always return that the given account is not elligible to any LDY staking tier, except if the account is in the highTierAccounts mapping.", + "params": { + "account": "The account to check the tier of." + } + }, + "unstake(uint256,uint256)": { + "details": "Emits a `Unstaked` event upon successful withdrawal. On full withdrawal, userStakingInfo removes stake pool for stakeIndex.", + "params": { + "amount": "The amount of tokens to withdraw.", + "stakeIndex": "The index of user staking pool" + } + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "stateVariables": { + "highTierAccounts": { + "details": "This is notably used to allow PreMining contracts to benefit from 0% withdrawal fees in L-Tokens contracts, when accounts unlock their funds." + } + }, + "title": "LDYStaking", + "version": 1 + }, + "userdoc": { + "events": { + "NotifiedRewardAmount(uint256,uint256)": { + "notice": "Emitted when admin add rewards." + }, + "RewardPaid(address,uint256,uint256)": { + "notice": "Emitted when users claim rewards" + }, + "Staked(address,uint256,uint256)": { + "notice": "Emitted when users stake token" + }, + "Unstaked(address,uint256,uint256)": { + "notice": "Emitted when users unstake token" + } + }, + "kind": "user", + "methods": { + "earned(address,uint256)": { + "notice": "Calculate the user's stake pool earnings" + }, + "finishAt()": { + "notice": "Timestamp of when the rewards finish." + }, + "getEarnedUser(address)": { + "notice": "Get the earned rewards array for a user." + }, + "getReward(uint256)": { + "notice": "Claim pending rewards." + }, + "getUserStakes(address)": { + "notice": "Get User Stake Data." + }, + "globalBlacklist()": { + "notice": "Retrieves the address of GlobalBlacklist contract." + }, + "globalOwner()": { + "notice": "Retrieves the address of GlobalOwner contract." + }, + "globalPause()": { + "notice": "Retrieves the address of GlobalPause contract." + }, + "highTierAccounts(address)": { + "notice": "Holds a mapping of addresses that default to the highest staking tier." + }, + "initialize(address,address,address,address,uint256[],uint256,uint256)": { + "notice": "Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once." + }, + "lastTimeRewardApplicable()": { + "notice": "Get the last time when rewards were applicable for the specified reward token." + }, + "lastUpdateTime()": { + "notice": "Timestamp of the reward updated." + }, + "notifyRewardAmount(uint256)": { + "notice": "Notify the contract about the amount of rewards to be distributed and update reward parameters." + }, + "owner()": { + "notice": "Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead." + }, + "paused()": { + "notice": "Override of PausableUpgradeable.pause() that retrieves the pause state from the GlobalPause contract instead." + }, + "recoverERC20(address,uint256)": { + "notice": "Recovers a specified amount of a given token address. Will fail if the contract doesn't hold enough tokens." + }, + "renounceOwnership()": { + "notice": "Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "rewardPerToken()": { + "notice": "Calculate the reward per token for a given reward token." + }, + "rewardPerTokenStored()": { + "notice": "Reward per token stored, sum of (reward rate * dt * 1e18 / total supply)." + }, + "rewardRatePerSec()": { + "notice": "Reward per second(total rewards / duration)." + }, + "rewardsDuration()": { + "notice": "Duration of the rewards (in seconds)." + }, + "setRewardsDuration(uint256)": { + "notice": "Update Rewards Duration." + }, + "stake(uint256,uint8)": { + "notice": "Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards." + }, + "stakeAmountForPerks()": { + "notice": "Minimal stake amount for perks." + }, + "stakeDurationForPerks()": { + "notice": "Minimal stake duration for perks." + }, + "stakeDurations(uint256)": { + "notice": "Stake durations." + }, + "stakeRewardToken()": { + "notice": "Stake and Reward token." + }, + "totalStaked()": { + "notice": "Total staked amounts." + }, + "transferOwnership(address)": { + "notice": "Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "unstake(uint256,uint256)": { + "notice": "Withdraw staked tokens after stakeDuration has passed." + }, + "userStakingInfo(address,uint256)": { + "notice": "User stakingInfo map, user address => array of the staking info" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 928, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_paused", + "offset": 0, + "slot": "151", + "type": "t_bool" + }, + { + "astId": 1033, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 116, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_owner", + "offset": 0, + "slot": "201", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 7922, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_globalOwner", + "offset": 0, + "slot": "251", + "type": "t_contract(GlobalOwner)4308" + }, + { + "astId": 8006, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 8024, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_globalPause", + "offset": 0, + "slot": "302", + "type": "t_contract(GlobalPause)4384" + }, + { + "astId": 8083, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "303", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 8097, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_globalBlacklist", + "offset": 0, + "slot": "353", + "type": "t_contract(GlobalBlacklist)4261" + }, + { + "astId": 8171, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "354", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9190, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "404", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9281, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "454", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 1048, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "_status", + "offset": 0, + "slot": "504", + "type": "t_uint256" + }, + { + "astId": 1117, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "__gap", + "offset": 0, + "slot": "505", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4418, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "stakeRewardToken", + "offset": 0, + "slot": "554", + "type": "t_contract(IERC20Upgradeable)1808" + }, + { + "astId": 4421, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "stakeDurationForPerks", + "offset": 0, + "slot": "555", + "type": "t_uint256" + }, + { + "astId": 4424, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "stakeAmountForPerks", + "offset": 0, + "slot": "556", + "type": "t_uint256" + }, + { + "astId": 4428, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "stakeDurations", + "offset": 0, + "slot": "557", + "type": "t_array(t_uint256)dyn_storage" + }, + { + "astId": 4431, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "rewardsDuration", + "offset": 0, + "slot": "558", + "type": "t_uint256" + }, + { + "astId": 4434, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "finishAt", + "offset": 0, + "slot": "559", + "type": "t_uint256" + }, + { + "astId": 4437, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "lastUpdateTime", + "offset": 0, + "slot": "560", + "type": "t_uint256" + }, + { + "astId": 4440, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "rewardRatePerSec", + "offset": 0, + "slot": "561", + "type": "t_uint256" + }, + { + "astId": 4443, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "rewardPerTokenStored", + "offset": 0, + "slot": "562", + "type": "t_uint256" + }, + { + "astId": 4446, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "totalStaked", + "offset": 0, + "slot": "563", + "type": "t_uint256" + }, + { + "astId": 4453, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "userStakingInfo", + "offset": 0, + "slot": "564", + "type": "t_mapping(t_address,t_array(t_struct(StakingInfo)4414_storage)dyn_storage)" + }, + { + "astId": 4492, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "highTierAccounts", + "offset": 0, + "slot": "565", + "type": "t_mapping(t_address,t_bool)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(StakingInfo)4414_storage)dyn_storage": { + "base": "t_struct(StakingInfo)4414_storage", + "encoding": "dynamic_array", + "label": "struct LDYStaking.StakingInfo[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(GlobalBlacklist)4261": { + "encoding": "inplace", + "label": "contract GlobalBlacklist", + "numberOfBytes": "20" + }, + "t_contract(GlobalOwner)4308": { + "encoding": "inplace", + "label": "contract GlobalOwner", + "numberOfBytes": "20" + }, + "t_contract(GlobalPause)4384": { + "encoding": "inplace", + "label": "contract GlobalPause", + "numberOfBytes": "20" + }, + "t_contract(IERC20Upgradeable)1808": { + "encoding": "inplace", + "label": "contract IERC20Upgradeable", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_array(t_struct(StakingInfo)4414_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct LDYStaking.StakingInfo[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(StakingInfo)4414_storage)dyn_storage" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_struct(StakingInfo)4414_storage": { + "encoding": "inplace", + "label": "struct LDYStaking.StakingInfo", + "members": [ + { + "astId": 4405, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "stakedAmount", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 4407, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "unStakeAt", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 4409, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "duration", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 4411, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "rewardPerTokenPaid", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 4413, + "contract": "contracts/src/LDYStaking.sol:LDYStaking", + "label": "rewards", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LDYStaking_Proxy.json b/contracts/hardhat/deployments/baseSepolia/LDYStaking_Proxy.json new file mode 100644 index 00000000..6d0e7026 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LDYStaking_Proxy.json @@ -0,0 +1,144 @@ +{ + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "transactionIndex": 10, + "gasUsed": "585170", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000001000000000000000500000000000000000000000000000000000000000000000000000000000000000002000000000000004000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000004000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3", + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "logs": [ + { + "transactionIndex": 10, + "blockNumber": 9269451, + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001157f1b171dc382165389c43a70de2e73da3645e" + ], + "data": "0x", + "logIndex": 6, + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3" + }, + { + "transactionIndex": 10, + "blockNumber": 9269451, + "transactionHash": "0x274e77c713e3464828517367a7fe855d2362c3a3840c27ef030fa7c21d28c7fe", + "address": "0x5F1E968d9103ddDc896ff44B4Aac9972A422b4c1", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 7, + "blockHash": "0x070ec9ee32fa1f117916284554bfe16dbf4c30da584b7424ce43290b86aca7d3" + } + ], + "blockNumber": 9269451, + "cumulativeGasUsed": "4825667", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1157f1b171DC382165389c43a70De2E73da3645E", + "0x98645a1f00000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b20000000000000000000000009992cc9176f2b86c56fda697d814c1a054c2035e000000000000000000000000546b48297ce50fa31a383afe7df48297337c12b5000000000000000000000000e376bd13399f1f86ad659145a2bed2cdc24a7e5e00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000001ea6e0000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000028de800000000000000000000000000000000000000000000000000000000000f537000000000000000000000000000000000000000000000000000000000001ea6e000000000000000000000000000000000000000000000000000000000003d4dc000000000000000000000000000000000000000000000000000000000005bf4a00" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LTokenSignaler.json b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler.json new file mode 100644 index 00000000..f020888f --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler.json @@ -0,0 +1,312 @@ +{ + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "LTokenSignalEvent", + "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": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "transactionIndex": 4, + "gasUsed": "332603", + "logsBloom": "0x00000000000000000000000000000000400000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000008000000000020000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000001400000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328", + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 9269469, + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000ba93a7d76cd3873d63cb9f6510fef3c1fb78be86" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328" + }, + { + "transactionIndex": 4, + "blockNumber": 9269469, + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328" + } + ], + "blockNumber": 9269469, + "cumulativeGasUsed": "2600968", + "status": 1, + "byzantium": true + }, + "args": [ + "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [ + "0x01413E00B19Dde5A37a4Ef46eABa394535FdB1B2" + ] + }, + "implementation": "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Implementation.json b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Implementation.json new file mode 100644 index 00000000..64dcbb05 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Implementation.json @@ -0,0 +1,461 @@ +{ + "address": "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "abi": [ + { + "inputs": [], + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "LTokenSignalEvent", + "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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "globalOwner_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lTokenAddress", + "type": "address" + } + ], + "name": "signalLToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "transactionHash": "0xcfcc1b29e2787ce89663f9927e687f258815a3d3003d9370261d46db1efd8548", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "transactionIndex": 1, + "gasUsed": "862865", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000400000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc9b58168d7161c6baf0c9755b69a3f4b331f47bd725b2e4804bd5cde4a17ecc6", + "transactionHash": "0xcfcc1b29e2787ce89663f9927e687f258815a3d3003d9370261d46db1efd8548", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 9269465, + "transactionHash": "0xcfcc1b29e2787ce89663f9927e687f258815a3d3003d9370261d46db1efd8548", + "address": "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 0, + "blockHash": "0xc9b58168d7161c6baf0c9755b69a3f4b331f47bd725b2e4804bd5cde4a17ecc6" + } + ], + "blockNumber": 9269465, + "cumulativeGasUsed": "906740", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "15c81200c85905d33a34abc672a45266", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"LTokenSignalEvent\",\"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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"signalLToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Signal are ignored by the subgraph if the L-Token is already known by it.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LTokenSignalEvent(address)\":{\"params\":{\"lTokenAddress\":\"The address of the L-Token contract to signal.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"signalLToken(address)\":{\"params\":{\"lTokenAddress\":\"The address of the LToken contract to signal.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"LTokenSignaler\",\"version\":1},\"userdoc\":{\"events\":{\"LTokenSignalEvent(address)\":{\"notice\":\"Emitted to inform subgraph of the existence of a new L-Token contract.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"signalLToken(address)\":{\"notice\":\"Signals a LToken contract to the TheGraph subgraph of the current chain.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Used to inform subgraph from the existence of a new L-Token contract. Once signaled, a L-Token will start being indexed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LTokenSignaler.sol\":\"LTokenSignaler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/LTokenSignaler.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title LTokenSignaler\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\\n * signaled, a L-Token will start being indexed.\\n *\\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\\n * @param lTokenAddress The address of the L-Token contract to signal.\\n */\\n event LTokenSignalEvent(address indexed lTokenAddress);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\\n * @param lTokenAddress The address of the LToken contract to signal.\\n */\\n function signalLToken(address lTokenAddress) external onlyOwner {\\n // Signal the LToken contract\\n emit LTokenSignalEvent(lTokenAddress);\\n }\\n}\\n\",\"keccak256\":\"0xdfbd3364c76705fb67b72cdb405d6691a9b2e3cbcc0f3f783add6ac6cc855bd3\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2e610118600039600081816101b2015281816101fb0152818161029a015281816102da015261036d0152610e2e6000f3fe6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122068da0230acd1366802db80aa8fbec2cdf9b29855484e88bbd5526025431b168464736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122068da0230acd1366802db80aa8fbec2cdf9b29855484e88bbd5526025431b168464736f6c63430008120033", + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Signal are ignored by the subgraph if the L-Token is already known by it.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "LTokenSignalEvent(address)": { + "params": { + "lTokenAddress": "The address of the L-Token contract to signal." + } + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "details": "See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--" + }, + "globalOwner()": { + "returns": { + "_0": "The address of the GlobalOwner contract." + } + }, + "initialize(address)": { + "details": "See: https://docs.openzeppelin.com/contracts/4.x/upgradeable" + }, + "owner()": { + "returns": { + "_0": "The address of the owner" + } + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "signalLToken(address)": { + "params": { + "lTokenAddress": "The address of the LToken contract to signal." + } + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "title": "LTokenSignaler", + "version": 1 + }, + "userdoc": { + "events": { + "LTokenSignalEvent(address)": { + "notice": "Emitted to inform subgraph of the existence of a new L-Token contract." + } + }, + "kind": "user", + "methods": { + "constructor": { + "notice": "Prevents implementation contract from being initialized as recommended by OpenZeppelin." + }, + "globalOwner()": { + "notice": "Retrieves the address of GlobalOwner contract." + }, + "initialize(address)": { + "notice": "Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts." + }, + "owner()": { + "notice": "Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead." + }, + "renounceOwnership()": { + "notice": "Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "signalLToken(address)": { + "notice": "Signals a LToken contract to the TheGraph subgraph of the current chain." + }, + "transferOwnership(address)": { + "notice": "Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + } + }, + "notice": "Used to inform subgraph from the existence of a new L-Token contract. Once signaled, a L-Token will start being indexed.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 116, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "_owner", + "offset": 0, + "slot": "151", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 8691, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "_globalOwner", + "offset": 0, + "slot": "201", + "type": "t_contract(GlobalOwner)5028" + }, + { + "astId": 8775, + "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(GlobalOwner)5028": { + "encoding": "inplace", + "label": "contract GlobalOwner", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Proxy.json b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Proxy.json new file mode 100644 index 00000000..3431f0cb --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LTokenSignaler_Proxy.json @@ -0,0 +1,144 @@ +{ + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "transactionIndex": 4, + "gasUsed": "332603", + "logsBloom": "0x00000000000000000000000000000000400000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000008000000000020000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000001400000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328", + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 9269469, + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000ba93a7d76cd3873d63cb9f6510fef3c1fb78be86" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328" + }, + { + "transactionIndex": 4, + "blockNumber": 9269469, + "transactionHash": "0x0844100b3b566a106c7020c768a2252029f6bbc668a99e60b207d0178d589091", + "address": "0x51890D5AF72Cd619f8bF1535e655b1A73a7b399B", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0x2a64aadf4bd6b093aa3abef414d68e9994065953cb15c36b66fb10ab1693c328" + } + ], + "blockNumber": 9269469, + "cumulativeGasUsed": "2600968", + "status": 1, + "byzantium": true + }, + "args": [ + "0xBa93a7D76cD3873D63cb9F6510FEF3c1fB78be86", + "0xc4d66de800000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b2" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LUSDC.json b/contracts/hardhat/deployments/baseSepolia/LUSDC.json new file mode 100644 index 00000000..21497920 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LUSDC.json @@ -0,0 +1,1399 @@ +{ + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" + } + ], + "name": "APRChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" + } + ], + "name": "ActivityEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "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": "balanceBefore", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "name": "MintedRewardsEvent", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" + } + ], + "name": "TVLChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimFees", + "outputs": [], + "stateMutability": "nonpayable", + "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fund", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAPR", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getWithdrawnAmountAndFees", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "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": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "invested", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyStaking", + "outputs": [ + { + "internalType": "contract LDYStaking", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "realBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "realTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardsRedirectsFromTo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "fund_", + "type": "address" + } + ], + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ldyStakingAddress", + "type": "address" + } + ], + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" + } + ], + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawer_", + "type": "address" + } + ], + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalQueued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", + "outputs": [ + { + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unclaimedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "underlying", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unmintedRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "withdrawalQueue", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueueCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawer", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "transactionIndex": 6, + "gasUsed": "659225", + "logsBloom": "0x00000000000000000000000000000000400000000200000000000000000000000000000000000000000000000000100000000000000400000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000020000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000", + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add", + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 9269461, + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002c0f4c6127693c688ff4b8794fdb22ffb235cd87" + ], + "data": "0x", + "logIndex": 11, + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add" + }, + { + "transactionIndex": 6, + "blockNumber": 9269461, + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 12, + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add" + } + ], + "blockNumber": 9269461, + "cumulativeGasUsed": "1515560", + "status": 1, + "byzantium": true + }, + "args": [ + "0x2c0F4C6127693C688ff4b8794fdB22FfB235cd87", + "0x1459457a00000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b20000000000000000000000009992cc9176f2b86c56fda697d814c1a054c2035e000000000000000000000000546b48297ce50fa31a383afe7df48297337c12b50000000000000000000000005f1e968d9103dddc896ff44b4aac9972a422b4c1000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e" + ], + "numDeployments": 2, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "implementation": "0xE0434e00f3088Ed0cE950F985f9dbe9898A18153", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LUSDC_Implementation.json b/contracts/hardhat/deployments/baseSepolia/LUSDC_Implementation.json new file mode 100644 index 00000000..3492c689 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LUSDC_Implementation.json @@ -0,0 +1,2505 @@ +{ + "address": "0xE0434e00f3088Ed0cE950F985f9dbe9898A18153", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newAPRUD7x3", + "type": "uint16" + } + ], + "name": "APRChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "id", + "type": "int256" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum LToken.Action", + "name": "action", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountAfterFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum LToken.Status", + "name": "newStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newId", + "type": "int256" + } + ], + "name": "ActivityEvent", + "type": "event" + }, + { + "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": "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + } + ], + "name": "MintedRewardsEvent", + "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": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTVL", + "type": "uint256" + } + ], + "name": "TVLChangeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimFees", + "outputs": [], + "stateMutability": "nonpayable", + "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": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "feesRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "frozenRequests", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fund", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAPR", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExpectedRetained", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getWithdrawnAmountAndFees", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawnAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalBlacklist", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalPause", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "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": "globalOwner_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalPause_", + "type": "address" + }, + { + "internalType": "address", + "name": "globalBlacklist_", + "type": "address" + }, + { + "internalType": "address", + "name": "ldyStaking_", + "type": "address" + }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "instantWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "invested", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ldyStaking", + "outputs": [ + { + "internalType": "contract LDYStaking", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "listenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "processBigQueuedRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "processQueuedRequests", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "realBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "realTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverUnderlying", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "repatriate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestWithdrawal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "retentionRateUD7x3", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardsRedirectsFromTo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardsRedirectsToFrom", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "aprUD7x3", + "type": "uint16" + } + ], + "name": "setAPR", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "feesRateUD7x3_", + "type": "uint32" + } + ], + "name": "setFeesRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "fund_", + "type": "address" + } + ], + "name": "setFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ldyStakingAddress", + "type": "address" + } + ], + "name": "setLDYStaking", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "retentionRateUD7x3_", + "type": "uint32" + } + ], + "name": "setRetentionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "withdrawer_", + "type": "address" + } + ], + "name": "setWithdrawer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "startRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "stopRewardsRedirection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalQueued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "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": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfersListeners", + "outputs": [ + { + "internalType": "contract ITransfersListener", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unclaimedFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "underlying", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "listenerContract", + "type": "address" + } + ], + "name": "unlistenToTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "unmintedRewardsOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "usableUnderlyings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawTo", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "withdrawalQueue", + "outputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueueCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawer", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x34160376d9832108db7a7ddd6ca5080ee6c9c7147f4d6792a92694febd7472d6", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0xE0434e00f3088Ed0cE950F985f9dbe9898A18153", + "transactionIndex": 6, + "gasUsed": "5364287", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x0f16ed49d59fa4775f0d0f9e3274ce73ec6966d6b2e1f974f3b2da52065472a7", + "transactionHash": "0x34160376d9832108db7a7ddd6ca5080ee6c9c7147f4d6792a92694febd7472d6", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 9344979, + "transactionHash": "0x34160376d9832108db7a7ddd6ca5080ee6c9c7147f4d6792a92694febd7472d6", + "address": "0xE0434e00f3088Ed0cE950F985f9dbe9898A18153", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 10, + "blockHash": "0x0f16ed49d59fa4775f0d0f9e3274ce73ec6966d6b2e1f974f3b2da52065472a7" + } + ], + "blockNumber": 9344979, + "cumulativeGasUsed": "9159598", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 2, + "solcInputHash": "c8300f1cd6a8c81a83ee050186e6d667", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newAPRUD7x3\",\"type\":\"uint16\"}],\"name\":\"APRChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"id\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum LToken.Action\",\"name\":\"action\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountAfterFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum LToken.Status\",\"name\":\"newStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"newId\",\"type\":\"int256\"}],\"name\":\"ActivityEvent\",\"type\":\"event\"},{\"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\":\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"}],\"name\":\"MintedRewardsEvent\",\"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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTVL\",\"type\":\"uint256\"}],\"name\":\"TVLChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"cancelWithdrawalRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feesRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"frozenRequests\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fund\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAPR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedRetained\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"getWithdrawnAmountAndFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"withdrawnAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalBlacklist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalPause\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"globalOwner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalPause_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalBlacklist_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ldyStaking_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"underlyingToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"instantWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"invested\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ldyStaking\",\"outputs\":[{\"internalType\":\"contract LDYStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"listenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"processBigQueuedRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processQueuedRequests\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"realBalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"realTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverUnderlying\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"repatriate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retentionRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardsRedirectsFromTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardsRedirectsToFrom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"aprUD7x3\",\"type\":\"uint16\"}],\"name\":\"setAPR\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"feesRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setFeesRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"fund_\",\"type\":\"address\"}],\"name\":\"setFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ldyStakingAddress\",\"type\":\"address\"}],\"name\":\"setLDYStaking\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"retentionRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setRetentionRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawer_\",\"type\":\"address\"}],\"name\":\"setWithdrawer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"startRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"stopRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalQueued\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transfersListeners\",\"outputs\":[{\"internalType\":\"contract ITransfersListener\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unclaimedFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"unlistenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unmintedRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usableUnderlyings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawalQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalQueueCursor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawer\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:oz-upgrades-unsafe-allow\":\"external-library-linking\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Definitions: - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio). - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees). - Instant: Processed immediately. - Request: Queued for later processing. - Big Request: A requested withdrawal exceeding half of the retention rate. - (Withdrawal) queue: A list of all requested withdrawals sorted by priority. - Request ID: The index of a withdrawal request in the queue array. - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain. - Fees Rate: Percentage of fees applied to successful withdrawals. - Usable underlyings: Amount of underlying tokens that have been deposited through expected ways and are so considered safe to use by the contract. - Transfers listeners: External contracts listening on L-Tokens transfers. - Fund wallet: Wallet managed by the Ledgity's financial team. - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request processing. Note that words between parenthesis are sometimes omitted for brevity.Deployment notice: This contract can safely receive funds immediately after initialization. (i.e., there is no way for funds to be sent to non-owned addresses). It is, however, recommended to replace ASAP owner and fund wallets with multi-sig wallets.For further details, see \\\"LToken\\\" section of whitepaper.\",\"events\":{\"APRChangeEvent(uint16)\":{\"params\":{\"newAPRUD7x3\":\"The new APR in UD7x3 format.\"}},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"params\":{\"account\":\"The account involved in the activity.\",\"action\":\"The type of activity.\",\"amount\":\"The amount of underlying tokens involved in the activity.\",\"id\":\"ID of the involved withdrawal request or NO_ID (-1) if not applicable.\",\"newId\":\"The new ID of the request if it has been moved in the queue.\",\"newStatus\":\"The new status of the activity.\"}},\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"params\":{\"account\":\"The account that received the rewards.\",\"balanceBefore\":\"The balance of the account before the minting.\",\"rewards\":\"The amount of minted rewards.\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"TVLChangeEvent(uint256)\":{\"details\":\"TVL = realTotalSupply()\",\"params\":{\"newTVL\":\"The new TVL of the contract.\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"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\":\"This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have not been yet minted to the specified account.\",\"params\":{\"account\":\"The account to check the total balance of.\"},\"returns\":{\"_0\":\"The total balance of the account.\"}},\"cancelWithdrawalRequest(uint256)\":{\"params\":{\"requestId\":\"The ID of the withdrawal request to cancel.\"}},\"decimals()\":{\"details\":\"The ERC20WrapperUpgradeable version is preferred because it mirrors the decimals amount of the underlying stablecoin token.\"},\"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`.\"},\"deposit(uint256)\":{\"params\":{\"amount\":\"The amount of underlying tokens to deposit.\"}},\"depositFor(address,uint256)\":{\"details\":\"Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\"},\"getAPR()\":{\"returns\":{\"_0\":\"The current APR in UD7x3 format.\"}},\"getExpectedRetained()\":{\"returns\":{\"amount\":\"The expected amount of retained underlying tokens.\"}},\"getWithdrawnAmountAndFees(address,uint256)\":{\"params\":{\"account\":\"The account initiating the withdrawal.\",\"amount\":\"The amount of the withdrawal.\"}},\"globalBlacklist()\":{\"returns\":{\"_0\":\"The address of the GlobalBlacklist contract.\"}},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"globalPause()\":{\"returns\":{\"_0\":\"The address of the GlobalPause contract.\"}},\"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,address,address,address,address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalBlacklist_\":\"The address of the GlobalBlacklist contract.\",\"globalOwner_\":\"The address of the GlobalOwner contract.\",\"globalPause_\":\"The address of the GlobalPause contract.\",\"underlyingToken\":\"The address of the underlying stablecoin ERC20 token.\"}},\"instantWithdrawal(uint256)\":{\"details\":\"In order to save some gas and time to users, frontends should propose this function to users only when it has been verified that it will not revert. They should propose the requestWithdrawal() function otherwise.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"invested()\":{\"returns\":{\"_0\":\"The reference to the invested token contract.\"}},\"listenToTransfers(address)\":{\"details\":\"Each time a transfer occurs, the onLTokenTransfer() function of the specified contract will be called.IMPORTANT SECURITY NOTE: This method is not intended to be used with contracts that are not owned by the Ledgity team.\",\"params\":{\"listenerContract\":\"The address of the new transfers listener contract.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"paused()\":{\"details\":\"Both version are the same as ERC20BaseUpgradeable.paused() mirrors GlobalPausableUpgradeable.paused(), so a random one is chosen.\",\"returns\":{\"_0\":\"Whether the contract is paused or not.\"}},\"processBigQueuedRequest(uint256)\":{\"details\":\"In contrast to non-big requests processing, this function will uses to fund wallet's balance to fill the request. This allows processing requests that are greater than retention rate without having to exceed this rate on the contract.\",\"params\":{\"requestId\":\"The ID of the big request to process.\"}},\"processQueuedRequests()\":{\"details\":\"For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"realBalanceOf(address)\":{\"params\":{\"account\":\"The account to check the real balance of.\"},\"returns\":{\"_0\":\"The real balance of the account.\"}},\"realTotalSupply()\":{\"returns\":{\"_0\":\"The real total supply of L-Tokens.\"}},\"recoverERC20(address,uint256)\":{\"details\":\"This override of RecoverableUpgradeable.recoverERC20() prevents the recovered token from being the underlying token.\",\"params\":{\"amount\":\"The amount of token to recover.\",\"tokenAddress\":\"The address of the token to recover.\"}},\"recoverUnderlying()\":{\"details\":\"To prevent owner from being able to drain the contract, this function only allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been sent through fund() or deposit() functions.\"},\"repatriate(uint256)\":{\"details\":\"The function will revert if repatriated amount makes the contract exceeding the retention rate.\",\"params\":{\"amount\":\"The amount of underlying tokens to repatriate.\"}},\"requestWithdrawal(uint256)\":{\"details\":\"The sender must attach 0.003 ETH to pre-pay the future processing gas fees paid by the withdrawer wallet.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"setAPR(uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\"}},\"setFeesRate(uint32)\":{\"params\":{\"feesRateUD7x3_\":\"The new withdrawal fee rate in UD7x3 format.\"}},\"setFund(address)\":{\"params\":{\"fund_\":\"The address of the new fund wallet.\"}},\"setLDYStaking(address)\":{\"params\":{\"ldyStakingAddress\":\"The address of the new LDYStaking contract.\"}},\"setRetentionRate(uint32)\":{\"details\":\"The retention rate is capped at 10%, which ensures that no more than 10% of deposited assets will ever be exposed in this contract (reduces attack surface).\",\"params\":{\"retentionRateUD7x3_\":\"The new retention rate in UD7x3 format.\"}},\"setWithdrawer(address)\":{\"params\":{\"withdrawer_\":\"The address of the new withdrawer wallet.\"}},\"startRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to redirect rewards from.\",\"to\":\"The address of the account to redirect rewards to.\"}},\"stopRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to stop redirecting rewards from.\",\"to\":\"The address of the account to stop redirecting rewards to.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply of L-Tokens.\"}},\"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`.\"},\"underlying()\":{\"details\":\"Returns the address of the underlying ERC-20 token that is being wrapped.\"},\"unlistenToTransfers(address)\":{\"details\":\"The onLTokenTransfer() function of the specified contract will not be called anymore each time a L-Token transfer occurs.\",\"params\":{\"listenerContract\":\"The address of the listener contract.\"}},\"unmintedRewardsOf(address)\":{\"details\":\"This is a public implementation of InvestUpgradeable_rewardsOf(). In the context of LToken, this function returns the amount of rewards that have not been distributed/minted yet to the specified account.This is particularly useful for off-chain services to display charts and statistics, as seen in the Ledgity Yield's frontend.\",\"params\":{\"account\":\"The account to check the unminted rewards of.\"},\"returns\":{\"_0\":\"The amount of account's unminted rewards.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawTo(address,uint256)\":{\"details\":\"Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\"}},\"stateVariables\":{\"frozenRequests\":{\"details\":\"If a request emitter as been blacklisted, its request is moved here to prevent it from blocking the queue.\"},\"transfersListeners\":{\"details\":\"onLTokenTransfer() functions of those contracts will be called on each transfer.\"},\"usableUnderlyings\":{\"details\":\"Are usable, only underlying tokens deposit through deposit() or fund() functions.\"}},\"title\":\"LToken\",\"version\":1},\"userdoc\":{\"events\":{\"APRChangeEvent(uint16)\":{\"notice\":\"Emitted to inform listeners about a change in the APR's value.\"},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"notice\":\"Emitted to inform listerners about an activity related to deposits and withdrawals.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"notice\":\"Emitted to inform listeners that some rewards have been minted.\"},\"TVLChangeEvent(uint256)\":{\"notice\":\"Emitted to inform listeners about a change in the contract's TVL.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address)\":{\"notice\":\"Retrieves the total balance of L-Tokens that belong to the account.\"},\"cancelWithdrawalRequest(uint256)\":{\"notice\":\"Cancels a given withdrawal request. The request emitter receive back its L-Tokens and no fees will be charged.\"},\"claimFees()\":{\"notice\":\"Used by owner to claim fees generated from successful withdrawals.\"},\"decimals()\":{\"notice\":\"Required override of decimals() which is implemented by both ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\"},\"deposit(uint256)\":{\"notice\":\"Allows exchanging some underlying tokens for the same amount of L-Tokens.\"},\"depositFor(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.depositFor() that reverts. Use deposit() function instead.\"},\"feesRateUD7x3()\":{\"notice\":\"Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\"},\"frozenRequests(uint256)\":{\"notice\":\"Holds a list of all currently frozen withdrawal requests.\"},\"fund()\":{\"notice\":\"Holds address of fund wallet (managed by Ledgity financial team).\"},\"getAPR()\":{\"notice\":\"Retrieves the most recently set APR.\"},\"getExpectedRetained()\":{\"notice\":\"Computes the maximum amount of underlying tokens that should be retained by the contract (based on retention rate).\"},\"getWithdrawnAmountAndFees(address,uint256)\":{\"notice\":\"Computes fees and net withdrawn amount for a given account withdrawing a given amount.\"},\"globalBlacklist()\":{\"notice\":\"Retrieves the address of GlobalBlacklist contract.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"globalPause()\":{\"notice\":\"Retrieves the address of GlobalPause contract.\"},\"initialize(address,address,address,address,address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"instantWithdrawal(uint256)\":{\"notice\":\"Allows instaneously exchanging a given amount of L-Tokens for the same amount of underlying tokens. It will fail if the contract currently doesn't hold enough underlying tokens to cover the withdrawal.\"},\"invested()\":{\"notice\":\"Retrieves the reference to the invested token contract.\"},\"ldyStaking()\":{\"notice\":\"Holds a reference to the LDYStaking contract.\"},\"listenToTransfers(address)\":{\"notice\":\"Adds a new contract to the L-Token transfers list.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"paused()\":{\"notice\":\"Required override of paused() which is implemented by both GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\"},\"processBigQueuedRequest(uint256)\":{\"notice\":\"Processes a given queued big withdrawal request (one that exceeds half of the retention rate).\"},\"processQueuedRequests()\":{\"notice\":\"Processes queued withdrawal requests until there is else no more requests, else not enough underlying tokens to continue.\"},\"realBalanceOf(address)\":{\"notice\":\"Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet minted/distributed rewards.\"},\"realTotalSupply()\":{\"notice\":\"Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"recoverERC20(address,uint256)\":{\"notice\":\"Recovers a specified amount of a given token address.\"},\"recoverUnderlying()\":{\"notice\":\"Recovers underlying tokens accidentally sent to the contract.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"repatriate(uint256)\":{\"notice\":\"Used by the fund wallet to repatriate underlying tokens on the contract whenever those are required to fulfill some withdrawal requests.\"},\"requestWithdrawal(uint256)\":{\"notice\":\"Allows requesting the exchange of a given amount of L-Tokens for the same amount of underlying tokens. The request will be automatically processed later.\"},\"retentionRateUD7x3()\":{\"notice\":\"Holds the retention rate in UD7x3 format.\"},\"rewardsRedirectsFromTo(address)\":{\"notice\":\"Holds active rewards redirections in both from->to and to->from[] ways.\"},\"setAPR(uint16)\":{\"notice\":\"Updates the investment APR. Restricted to owner.\"},\"setFeesRate(uint32)\":{\"notice\":\"Updates the current withdrawal fee rate.\"},\"setFund(address)\":{\"notice\":\"Updates the address of the fund wallet.\"},\"setLDYStaking(address)\":{\"notice\":\"Updates the address of LDYStaking contract.\"},\"setRetentionRate(uint32)\":{\"notice\":\"Updates the current underlying token retention rate.\"},\"setWithdrawer(address)\":{\"notice\":\"Updates the address of the withdrawer wallet.\"},\"startRewardsRedirection(address,address)\":{\"notice\":\"Enables redirection of rewards from one account to another.\"},\"stopRewardsRedirection(address,address)\":{\"notice\":\"Disable an active rewards redirection.\"},\"totalQueued()\":{\"notice\":\"Holds the amount of L-Tokens currently in the withdrawal queue.\"},\"totalSupply()\":{\"notice\":\"Retrives the total supply of L-Tokens, including not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transfersListeners(uint256)\":{\"notice\":\"Holds a list of contracts' references that are listening to L-Tokens transfers.\"},\"unclaimedFees()\":{\"notice\":\"Holds the amount of withdrawal fees not yet claimed by contract's owner.\"},\"unlistenToTransfers(address)\":{\"notice\":\"Removes a contract from the L-Token transfers list.\"},\"unmintedRewardsOf(address)\":{\"notice\":\"Retrieves the amount of given account's not yet minted rewards.\"},\"usableUnderlyings()\":{\"notice\":\"Holds the amount of underlying tokens considered as usable by the contract.\"},\"withdrawTo(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.withdrawTo() that reverts. Use instantWithdrawal() or requestWithdrawal() functions instead.\"},\"withdrawalQueue(uint256)\":{\"notice\":\"Holds an ordered list of active withdrawal requests.\"},\"withdrawalQueueCursor()\":{\"notice\":\"Holds the index of the next withdrawal request to process in the queue.\"},\"withdrawer()\":{\"notice\":\"Holds address of withdrawer wallet (managed by withdrawal server).\"}},\"notice\":\"Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e., investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin. As soon as a wallet holds some L-Tokens, it starts receiving rewards in the form of additional L-Tokens, which are auto-compounded over time.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LToken.sol\":\"LToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\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\",\"keccak256\":\"0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\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 /**\\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[45] private __gap;\\n}\\n\",\"keccak256\":\"0xd14a627157b9a411d2410713e5dd3a377e9064bd5c194a90748bbf27ea625784\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\\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\",\"keccak256\":\"0x0e1f0f5f62f67a881cd1a9597acbc0a5e4071f3c2c10449a183b922ae7272e3f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../../../security/PausableUpgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev ERC20 token with pausable token transfers, minting and burning.\\n *\\n * Useful for scenarios such as preventing trades until the end of an evaluation\\n * period, or having an emergency switch for freezing all token transfers in the\\n * event of a large bug.\\n *\\n * IMPORTANT: This contract does not include public pause and unpause functions. In\\n * addition to inheriting this contract, you must define both functions, invoking the\\n * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate\\n * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will\\n * make the contract unpausable.\\n */\\nabstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {\\n function __ERC20Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __ERC20Pausable_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {ERC20-_beforeTokenTransfer}.\\n *\\n * Requirements:\\n *\\n * - the contract must not be paused.\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n super._beforeTokenTransfer(from, to, amount);\\n\\n require(!paused(), \\\"ERC20Pausable: token transfer while paused\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xf0bd7f71ffae5f0addd375e8511fbf2ad8ca0c9b2606c32d92bdda7d76a7a81c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Wrapper.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Extension of the ERC20 token contract to support token wrapping.\\n *\\n * Users can deposit and withdraw \\\"underlying tokens\\\" and receive a matching number of \\\"wrapped tokens\\\". This is useful\\n * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the\\n * wrapping of an existing \\\"basic\\\" ERC20 into a governance token.\\n *\\n * _Available since v4.2._\\n *\\n * @custom:storage-size 51\\n */\\nabstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {\\n IERC20Upgradeable private _underlying;\\n\\n function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n __ERC20Wrapper_init_unchained(underlyingToken);\\n }\\n\\n function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n require(underlyingToken != this, \\\"ERC20Wrapper: cannot self wrap\\\");\\n _underlying = underlyingToken;\\n }\\n\\n /**\\n * @dev See {ERC20-decimals}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n try IERC20MetadataUpgradeable(address(_underlying)).decimals() returns (uint8 value) {\\n return value;\\n } catch {\\n return super.decimals();\\n }\\n }\\n\\n /**\\n * @dev Returns the address of the underlying ERC-20 token that is being wrapped.\\n */\\n function underlying() public view returns (IERC20Upgradeable) {\\n return _underlying;\\n }\\n\\n /**\\n * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\\n */\\n function depositFor(address account, uint256 amount) public virtual returns (bool) {\\n address sender = _msgSender();\\n require(sender != address(this), \\\"ERC20Wrapper: wrapper can't deposit\\\");\\n SafeERC20Upgradeable.safeTransferFrom(_underlying, sender, address(this), amount);\\n _mint(account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\\n */\\n function withdrawTo(address account, uint256 amount) public virtual returns (bool) {\\n _burn(_msgSender(), amount);\\n SafeERC20Upgradeable.safeTransfer(_underlying, account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal\\n * function that can be exposed with access control if desired.\\n */\\n function _recover(address account) internal virtual returns (uint256) {\\n uint256 value = _underlying.balanceOf(address(this)) - totalSupply();\\n _mint(account, value);\\n return value;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x14bb62a60fcbc911c33ac0e5456bf31ed50b502c30be46ee15bd3b698e91bd81\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.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 \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\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\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\\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\",\"keccak256\":\"0xd60f939a3ca0199014d079b4dd66aa757954334947d81eb5c1d35d7a83061ab3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../extensions/IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\\n * 0 before setting it to a non-zero value.\\n */\\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20PermitUpgradeable token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0x4dae161227d332808312ee2caf6384929321b83c16cc89b5642985fbec6b814c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/LDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {ReentrancyGuardUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport {BaseUpgradeable} from \\\"./abstracts/base/BaseUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @custom:security-contact security@ledgity.com\\n *\\n * @dev This contract implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is BaseUpgradeable, ReentrancyGuardUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Represents a user staking info in array.\\n * @param stakedAmount Amount of the stake.\\n * @param unStakeAt Unstake at.\\n * @param duration Staking period in seconds.\\n * @param rewardPerTokenPaid Reward per token paid.\\n * @param rewards Rewards to be claimed.\\n */\\n struct StakingInfo {\\n uint256 stakedAmount;\\n uint256 unStakeAt;\\n uint256 duration;\\n uint256 rewardPerTokenPaid;\\n uint256 rewards;\\n }\\n\\n /// @notice Stake and Reward token.\\n IERC20Upgradeable public stakeRewardToken;\\n\\n /// @notice Minimal stake duration for perks.\\n uint256 public stakeDurationForPerks;\\n\\n /// @notice Minimal stake amount for perks.\\n uint256 public stakeAmountForPerks;\\n\\n /// @notice Stake durations.\\n uint256[] public stakeDurations;\\n\\n /// @notice Duration of the rewards (in seconds).\\n uint256 public rewardsDuration;\\n\\n /// @notice Timestamp of when the rewards finish.\\n uint256 public finishAt;\\n\\n /// @notice Timestamp of the reward updated.\\n uint256 public lastUpdateTime;\\n\\n /// @notice Reward per second(total rewards / duration).\\n uint256 public rewardRatePerSec;\\n\\n /// @notice Reward per token stored, sum of (reward rate * dt * 1e18 / total supply).\\n uint256 public rewardPerTokenStored;\\n\\n /// @notice Total staked amounts.\\n uint256 public totalStaked;\\n\\n /// @notice User stakingInfo map, user address => array of the staking info\\n mapping(address => StakingInfo[]) public userStakingInfo;\\n\\n /**\\n * @notice Emitted when users stake token\\n * @param user User address\\n * @param stakeIndex Latest index of user staking pool\\n * @param amount Staked amount\\n */\\n event Staked(address indexed user, uint256 stakeIndex, uint256 amount);\\n\\n /**\\n * @notice Emitted when users unstake token\\n * @param user User address\\n * @param stakeIndex User staking pool index\\n * @param amount Staked amount\\n */\\n event Unstaked(address indexed user, uint256 stakeIndex, uint256 amount);\\n\\n /**\\n * @notice Emitted when users claim rewards\\n * @param user User address\\n * @param stakeIndex User staking pool index\\n * @param reward Reward token amount\\n */\\n event RewardPaid(address indexed user, uint256 stakeIndex, uint256 reward);\\n\\n /**\\n * @notice Emitted when admin add rewards.\\n * @param rewardAmount Reward amount added by admin.\\n * @param rewardPerSec RewardRatePerSec updated.\\n */\\n event NotifiedRewardAmount(uint256 rewardAmount, uint256 rewardPerSec);\\n\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once.\\n * @dev This function is intended for setting initial values for the contract's state variables.\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param stakeRewardToken_ The address of stake and reward token(LDY token).\\n * @param stakeDurations_ Available Staking Durations.\\n * @param stakeDurationForPerks_ Minimal staking duration for perks.\\n * @param stakeAmountForPerks_ Minimal staking amount for perks.\\n */\\n function initialize(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address stakeRewardToken_,\\n uint256[] memory stakeDurations_,\\n uint256 stakeDurationForPerks_,\\n uint256 stakeAmountForPerks_\\n ) public initializer {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n stakeRewardToken = IERC20Upgradeable(stakeRewardToken_);\\n stakeDurations = stakeDurations_;\\n stakeDurationForPerks = stakeDurationForPerks_;\\n stakeAmountForPerks = stakeAmountForPerks_;\\n }\\n\\n // --------------------\\n // MUTATIVE FUNCTIONS\\n // --------------------\\n\\n /**\\n * @notice Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards.\\n * @dev Emits a `Staked` event upon successful staking.\\n * @param amount The amount of tokens to stake.\\n * @param stakeDurationIndex The Index of stakeDurations array.\\n */\\n function stake(\\n uint256 amount,\\n uint8 stakeDurationIndex\\n ) external nonReentrant whenNotPaused notBlacklisted(_msgSender()) {\\n require(amount > 0, \\\"amount = 0\\\");\\n require(stakeDurationIndex <= stakeDurations.length - 1, \\\"invalid staking period\\\");\\n\\n _updateReward(address(0), 0);\\n uint256 stakeDuration = stakeDurations[stakeDurationIndex];\\n StakingInfo memory stakingInfo = StakingInfo({\\n stakedAmount: amount,\\n unStakeAt: block.timestamp + stakeDuration,\\n duration: stakeDuration,\\n rewardPerTokenPaid: rewardPerTokenStored,\\n rewards: 0\\n });\\n\\n // check whether account is eligible for benefit from the protocol\\n if (stakeDuration >= stakeDurationForPerks && amount >= stakeAmountForPerks) {\\n highTierAccounts[_msgSender()] = true;\\n }\\n\\n userStakingInfo[_msgSender()].push(stakingInfo);\\n\\n uint256 stakeIndex = userStakingInfo[_msgSender()].length - 1;\\n totalStaked += amount;\\n\\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\\n\\n emit Staked(_msgSender(), stakeIndex, amount);\\n }\\n\\n /**\\n * @notice Withdraw staked tokens after stakeDuration has passed.\\n * @dev Emits a `Unstaked` event upon successful withdrawal.\\n * On full withdrawal, userStakingInfo removes stake pool for stakeIndex.\\n * @param amount The amount of tokens to withdraw.\\n * @param stakeIndex The index of user staking pool\\n */\\n function unstake(\\n uint256 amount,\\n uint256 stakeIndex\\n ) external nonReentrant notBlacklisted(_msgSender()) {\\n require(amount > 0, \\\"amount = 0\\\");\\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \\\"invalid stakeIndex\\\");\\n require(\\n block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt,\\n \\\"not allowed unstaking in the staking period\\\"\\n );\\n require(\\n amount <= userStakingInfo[_msgSender()][stakeIndex].stakedAmount,\\n \\\"insufficient amount\\\"\\n );\\n\\n _updateReward(_msgSender(), stakeIndex);\\n totalStaked -= amount;\\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount -= amount;\\n\\n // check whether account is eligible for benefit from the protocol\\n if (\\n userStakingInfo[_msgSender()][stakeIndex].duration >= stakeDurationForPerks &&\\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount < stakeAmountForPerks\\n ) {\\n highTierAccounts[_msgSender()] = false;\\n }\\n\\n // remove staking info from array on full withdrawal\\n if (userStakingInfo[_msgSender()][stakeIndex].stakedAmount == 0) {\\n _claimReward(_msgSender(), stakeIndex);\\n\\n userStakingInfo[_msgSender()][stakeIndex] = userStakingInfo[_msgSender()][\\n userStakingInfo[_msgSender()].length - 1\\n ];\\n userStakingInfo[_msgSender()].pop();\\n }\\n stakeRewardToken.safeTransfer(_msgSender(), amount);\\n\\n emit Unstaked(_msgSender(), stakeIndex, amount);\\n }\\n\\n /**\\n * @notice Claim pending rewards.\\n * @dev Emits a `RewardPaid` event upon successful reward claim.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function getReward(uint256 stakeIndex) external nonReentrant notBlacklisted(_msgSender()) {\\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \\\"invalid stakeIndex\\\");\\n _updateReward(_msgSender(), stakeIndex);\\n _claimReward(_msgSender(), stakeIndex);\\n }\\n\\n // --------------------\\n // ADMIN CONFIGURATION\\n // --------------------\\n\\n /**\\n * @notice Update Rewards Duration.\\n * @dev Only callable by owner, and setting available only after rewards period.\\n * @param duration The nmew rewards duration in seconds.\\n */\\n function setRewardsDuration(uint256 duration) external onlyOwner {\\n require(finishAt < block.timestamp, \\\"reward duration is not finished\\\");\\n rewardsDuration = duration;\\n }\\n\\n /**\\n * @notice Notify the contract about the amount of rewards to be distributed and update reward parameters.\\n * @dev Only callable by owner.\\n * @param amount The amount of reward to be distributed.\\n */\\n function notifyRewardAmount(uint256 amount) external onlyOwner {\\n require(rewardsDuration > 0, \\\"rewards duration is not set\\\");\\n require(amount > 0, \\\"amount = 0\\\");\\n\\n _updateReward(address(0), 0);\\n\\n if (block.timestamp >= finishAt) {\\n rewardRatePerSec = amount / rewardsDuration;\\n } else {\\n uint256 remainingRewards = (finishAt - block.timestamp) * rewardRatePerSec;\\n rewardRatePerSec = (amount + remainingRewards) / rewardsDuration;\\n }\\n\\n require(rewardRatePerSec > 0, \\\"reward rate = 0\\\");\\n require(\\n rewardRatePerSec <=\\n (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) /\\n rewardsDuration,\\n \\\"reward amount > balance\\\"\\n );\\n\\n finishAt = block.timestamp + rewardsDuration;\\n lastUpdateTime = block.timestamp;\\n\\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\\n\\n emit NotifiedRewardAmount(amount, rewardRatePerSec);\\n }\\n\\n // --------------------\\n // VIEW FUNCTIONS\\n // --------------------\\n\\n /**\\n * @notice Get the last time when rewards were applicable for the specified reward token.\\n * @return Timestamp of the most recent rewards calculation.\\n */\\n function lastTimeRewardApplicable() public view returns (uint256) {\\n return _min(finishAt, block.timestamp);\\n }\\n\\n /**\\n * @notice Calculate the reward per token for a given reward token.\\n * @return Current reward per token.\\n */\\n function rewardPerToken() public view returns (uint256) {\\n if (totalStaked == 0) {\\n return rewardPerTokenStored;\\n }\\n\\n return\\n rewardPerTokenStored +\\n (rewardRatePerSec * (lastTimeRewardApplicable() - lastUpdateTime) * 1e18) /\\n totalStaked;\\n }\\n\\n /**\\n * @notice Calculate the user's stake pool earnings\\n * @param account Address of the user.\\n * @param stakeIndex Index of the stakePool\\n * @return Return earned amounts\\n */\\n function earned(address account, uint256 stakeIndex) public view returns (uint256) {\\n StakingInfo memory userInfo = userStakingInfo[account][stakeIndex];\\n uint256 rewardsSinceLastUpdate = ((userInfo.stakedAmount *\\n (rewardPerToken() - userInfo.rewardPerTokenPaid)) / 1e18);\\n return rewardsSinceLastUpdate + userInfo.rewards;\\n }\\n\\n /**\\n * @notice Get the earned rewards array for a user.\\n * @param account Address of the user.\\n * @return Return earned rewards array for a user.\\n */\\n function getEarnedUser(address account) public view returns (uint256[] memory) {\\n uint256 numberOfPools = userStakingInfo[account].length;\\n uint256[] memory earnedArray = new uint256[](numberOfPools);\\n for (uint256 index; index < numberOfPools; index++) {\\n earnedArray[index] = earned(account, index);\\n }\\n return earnedArray;\\n }\\n\\n /**\\n * @dev tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n\\n /**\\n * @notice Get User Stake Data.\\n * @param account The address of user.\\n * @return StakingInfo array.\\n */\\n function getUserStakes(address account) external view returns (StakingInfo[] memory) {\\n return userStakingInfo[account];\\n }\\n\\n /**\\n * @notice Send rewards to user.\\n * @dev This is private function, called by getReward function.\\n * @param account The address of user.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function _claimReward(address account, uint256 stakeIndex) private {\\n uint256 reward = userStakingInfo[account][stakeIndex].rewards;\\n\\n if (reward > 0) {\\n userStakingInfo[account][stakeIndex].rewards = 0;\\n stakeRewardToken.safeTransfer(account, reward);\\n emit RewardPaid(account, stakeIndex, reward);\\n }\\n }\\n\\n /**\\n * @notice Calculate and update user rewards per stakeIndex.\\n * @dev this is private function, called by stake, unstake, getRewards, and notifyRewardAmount functions.\\n * @param account The address of user.\\n * @param stakeIndex The index of user staking pool.\\n */\\n function _updateReward(address account, uint256 stakeIndex) private {\\n rewardPerTokenStored = rewardPerToken();\\n lastUpdateTime = lastTimeRewardApplicable();\\n\\n if (account != address(0)) {\\n userStakingInfo[account][stakeIndex].rewards = earned(account, stakeIndex);\\n userStakingInfo[account][stakeIndex].rewardPerTokenPaid = rewardPerTokenStored;\\n }\\n }\\n\\n /**\\n * @notice Take minimum value between x and y.\\n */\\n function _min(uint256 x, uint256 y) private pure returns (uint256) {\\n return x <= y ? x : y;\\n }\\n}\\n\",\"keccak256\":\"0x6e88a76db16dc5ad8717fd3cbedfda69d4537ed8b767e8765b8ce00668810b01\",\"license\":\"MIT\"},\"contracts/src/LToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {ERC20WrapperUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\\\";\\nimport \\\"./abstracts/base/ERC20BaseUpgradeable.sol\\\";\\nimport {InvestUpgradeable} from \\\"./abstracts/InvestUpgradeable.sol\\\";\\nimport {LDYStaking} from \\\"./LDYStaking.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {SUD} from \\\"./libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport {ITransfersListener} from \\\"./interfaces/ITransfersListener.sol\\\";\\n\\n/**\\n * @title LToken\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\\n * the form of additional L-Tokens, which are auto-compounded over time.\\n *\\n * @dev Definitions:\\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\\n * - Instant: Processed immediately.\\n * - Request: Queued for later processing.\\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\\n * - Request ID: The index of a withdrawal request in the queue array.\\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\\n * expected ways and are so considered safe to use by the contract.\\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\\n * processing.\\n *\\n * Note that words between parenthesis are sometimes omitted for brevity.\\n *\\n * @dev Deployment notice:\\n * This contract can safely receive funds immediately after initialization. (i.e., there\\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\\n * replace ASAP owner and fund wallets with multi-sig wallets.\\n *\\n * @dev For further details, see \\\"LToken\\\" section of whitepaper.\\n * @custom:oz-upgrades-unsafe-allow external-library-linking\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /// @dev Represents type of actions triggering ActivityEvent events.\\n enum Action {\\n Deposit,\\n Withdraw\\n }\\n\\n /// @dev Represents different status of actions triggering ActivityEvent events.\\n enum Status {\\n Queued,\\n Cancelled,\\n Success,\\n Moved\\n }\\n\\n /**\\n * @notice Represents a withdrawal request in the queue.\\n * @dev A request fits in a single storage slot (32 bytes).\\n * @param account The account that initiated the request.\\n * @param amount The amount of underlying tokens requested.\\n */\\n struct WithdrawalRequest {\\n address account; // 20 bytes\\n uint96 amount; // 12 bytes\\n }\\n\\n /// @notice Upper limit of retention rate.\\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\\n\\n /// @notice Upper limit of fees rate.\\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\\n\\n /// @notice Used in activity events to represent the absence of request ID.\\n int256 private constant NO_ID = -1;\\n\\n /// @notice Holds a reference to the LDYStaking contract.\\n LDYStaking public ldyStaking;\\n\\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\\n address payable public withdrawer;\\n\\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\\n address public fund;\\n\\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\\n uint32 public feesRateUD7x3;\\n\\n /// @notice Holds the retention rate in UD7x3 format.\\n uint32 public retentionRateUD7x3;\\n\\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\\n uint256 public unclaimedFees;\\n\\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\\n uint256 public totalQueued;\\n\\n /**\\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\\n */\\n uint256 public usableUnderlyings;\\n\\n /// @notice Holds an ordered list of active withdrawal requests.\\n WithdrawalRequest[] public withdrawalQueue;\\n\\n /// @notice Holds the index of the next withdrawal request to process in the queue.\\n uint256 public withdrawalQueueCursor;\\n\\n /**\\n * @notice Holds a list of all currently frozen withdrawal requests.\\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\\n * it from blocking the queue.\\n */\\n WithdrawalRequest[] public frozenRequests;\\n\\n /**\\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\\n */\\n ITransfersListener[] public transfersListeners;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the contract's TVL.\\n * @dev TVL = realTotalSupply()\\n * @param newTVL The new TVL of the contract.\\n */\\n event TVLChangeEvent(uint256 newTVL);\\n\\n /**\\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\\n * @param account The account involved in the activity.\\n * @param action The type of activity.\\n * @param amount The amount of underlying tokens involved in the activity.\\n * @param newStatus The new status of the activity.\\n * @param newId The new ID of the request if it has been moved in the queue.\\n */\\n event ActivityEvent(\\n int256 indexed id,\\n address indexed account,\\n Action indexed action,\\n uint256 amount,\\n uint256 amountAfterFees,\\n Status newStatus,\\n int256 newId\\n );\\n\\n /**\\n * @notice Emitted to inform listeners that some rewards have been minted.\\n * @param account The account that received the rewards.\\n * @param balanceBefore The balance of the account before the minting.\\n * @param rewards The amount of minted rewards.\\n */\\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\\n\\n /// @notice Reverts if the function caller is not the withdrawer wallet.\\n modifier onlyWithdrawer() {\\n require(_msgSender() == withdrawer, \\\"L39\\\");\\n _;\\n }\\n\\n /// @notice Reverts if the function caller is not the fund wallet.\\n modifier onlyFund() {\\n require(_msgSender() == fund, \\\"L40\\\");\\n _;\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\\n */\\n function initialize(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address ldyStaking_,\\n address underlyingToken\\n ) public initializer {\\n // Initialize ERC20 base.\\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\\n __ERC20Base_init(\\n globalOwner_,\\n globalPause_,\\n globalBlacklist_,\\n string(abi.encodePacked(\\\"Ledgity \\\", underlyingSymbol)),\\n string(abi.encodePacked(\\\"L\\\", underlyingSymbol))\\n );\\n\\n // IMPORTANT: Below calls must not be restricted to owner at any point.\\n // This is because the GlobalOwner contract may not be a fresh one, and so\\n // the contract deployer may not be the owner anymore after ERC20Base init.\\n\\n // Initialize other parents contracts.\\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\\n __Invest_init_unchained(address(this));\\n\\n // Set LDYStaking contract\\n ldyStaking = LDYStaking(ldyStaking_);\\n\\n // Set initial withdrawal fees rate to 0.3%\\n feesRateUD7x3 = 300;\\n\\n // Set initial retention rate to 10%\\n retentionRateUD7x3 = 10_000;\\n\\n // Default withdrawer and fund wallet to contract owner address. This prevents\\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\\n withdrawer = payable(owner());\\n fund = payable(owner());\\n }\\n\\n /**\\n * @notice Required override of decimals() which is implemented by both\\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\\n * decimals amount of the underlying stablecoin token.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function decimals()\\n public\\n view\\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\\n returns (uint8)\\n {\\n return ERC20WrapperUpgradeable.decimals();\\n }\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @notice Updates the current withdrawal fee rate.\\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\\n */\\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \\\"L88\\\");\\n feesRateUD7x3 = feesRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the current underlying token retention rate.\\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\\n * deposited assets will ever be exposed in this contract (reduces attack surface).\\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\\n */\\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \\\"L41\\\");\\n retentionRateUD7x3 = retentionRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the address of LDYStaking contract.\\n * @param ldyStakingAddress The address of the new LDYStaking contract.\\n */\\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\\n ldyStaking = LDYStaking(ldyStakingAddress);\\n }\\n\\n /**\\n * @notice Updates the address of the withdrawer wallet.\\n * @param withdrawer_ The address of the new withdrawer wallet.\\n */\\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\\n // Ensure address is not the zero address (pre-processing fees would be lost else)\\n require(withdrawer_ != address(0), \\\"L63\\\");\\n\\n // Set new withdrawer wallet's address\\n withdrawer = withdrawer_;\\n }\\n\\n /**\\n * @notice Updates the address of the fund wallet.\\n * @param fund_ The address of the new fund wallet.\\n */\\n function setFund(address payable fund_) public onlyOwner {\\n // Ensure address is not the zero address (deposited tokens would be lost else)\\n require(fund_ != address(0), \\\"L64\\\");\\n\\n // Set new fund wallet's address\\n fund = fund_;\\n }\\n\\n /**\\n * @notice Adds a new contract to the L-Token transfers list.\\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\\n * specified contract will be called.\\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\\n * contracts that are not owned by the Ledgity team.\\n * @param listenerContract The address of the new transfers listener contract.\\n */\\n function listenToTransfers(address listenerContract) public onlyOwner {\\n transfersListeners.push(ITransfersListener(listenerContract));\\n }\\n\\n /**\\n * @notice Removes a contract from the L-Token transfers list.\\n * @dev The onLTokenTransfer() function of the specified contract will not be called\\n * anymore each time a L-Token transfer occurs.\\n * @param listenerContract The address of the listener contract.\\n */\\n function unlistenToTransfers(address listenerContract) public onlyOwner {\\n // Find index of listener contract in transferListeners array\\n int256 index = -1;\\n uint256 transfersListenersLength = transfersListeners.length;\\n for (uint256 i = 0; i < transfersListenersLength; i++) {\\n if (address(transfersListeners[i]) == listenerContract) {\\n index = int256(i);\\n break;\\n }\\n }\\n\\n // Revert if given contract wasn't listening to transfers\\n require(index > -1, \\\"L42\\\");\\n\\n // Else, remove transfers listener contract from listeners array\\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\\n transfersListeners.pop();\\n }\\n\\n /**\\n * @notice Retrieves the amount of given account's not yet minted rewards.\\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\\n * context of LToken, this function returns the amount of rewards that have not been\\n * distributed/minted yet to the specified account.\\n * @dev This is particularly useful for off-chain services to display charts and\\n * statistics, as seen in the Ledgity Yield's frontend.\\n * @param account The account to check the unminted rewards of.\\n * @return The amount of account's unminted rewards.\\n */\\n function unmintedRewardsOf(address account) public view returns (uint256) {\\n return _rewardsOf(account, true);\\n }\\n\\n /**\\n * @notice Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet\\n * minted/distributed rewards.\\n * @param account The account to check the real balance of.\\n * @return The real balance of the account.\\n */\\n function realBalanceOf(address account) public view returns (uint256) {\\n return super.balanceOf(account);\\n }\\n\\n /**\\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\\n * not been yet minted to the specified account.\\n * @param account The account to check the total balance of.\\n * @return The total balance of the account.\\n */\\n function balanceOf(address account) public view override returns (uint256) {\\n return realBalanceOf(account) + unmintedRewardsOf(account);\\n }\\n\\n /**\\n * @notice Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet\\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\\n * @return The real total supply of L-Tokens.\\n */\\n function realTotalSupply() public view returns (uint256) {\\n return super.totalSupply();\\n }\\n\\n /**\\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\\n * fees and L-Tokens currently in the withdrawal queue.\\n * @return The total supply of L-Tokens.\\n */\\n function totalSupply() public view override returns (uint256) {\\n return realTotalSupply() + totalQueued + unclaimedFees;\\n }\\n\\n /**\\n * @notice Recovers a specified amount of a given token address.\\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\\n * token from being the underlying token.\\n * @inheritdoc RecoverableUpgradeable\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\\n // Ensure the token is not the underlying token\\n require(tokenAddress != address(underlying()), \\\"L43\\\");\\n\\n // Proceed to recovery\\n super.recoverERC20(tokenAddress, amount);\\n }\\n\\n /**\\n * @notice Recovers underlying tokens accidentally sent to the contract.\\n * @dev To prevent owner from being able to drain the contract, this function only\\n * allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been\\n * sent through fund() or deposit() functions.\\n */\\n function recoverUnderlying() external onlyOwner {\\n // Compute the recoverable amount by taking the difference between the contract's\\n // balance and the amount of usable underlying tokens\\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\\n\\n // Revert if there is nothing to recover\\n require(recoverableAmount > 0, \\\"L44\\\");\\n\\n // Else, proceed to underlying tokens recovery\\n super.recoverERC20(address(underlying()), recoverableAmount);\\n }\\n\\n /**\\n * @notice Retrieves the amount of underlying tokens invested by the given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\\n * LToken contract, the investment of an account is equal to its real balance.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _investmentOf(address account) internal view override returns (uint256) {\\n return realBalanceOf(account);\\n }\\n\\n /**\\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract so\\n * it can distribute rewards to accounts before each period reset.\\n * @dev InvestUpgradeable contract already ensure that amount > 0.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\\n // Inform listeners of the rewards minting\\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\\n\\n // Mint L-Tokens rewards to account\\n _mint(account, amount);\\n\\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\\n return true;\\n }\\n\\n /**\\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\\n * called each time an account's balance is going to change.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\\n * @inheritdoc ERC20BaseUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\\n\\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\\n if (from != address(0)) _beforeInvestmentChange(from, true);\\n if (to != address(0)) _beforeInvestmentChange(to, true);\\n }\\n\\n /**\\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\\n * transfers listeners.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already checked in _beforeTokenTransfer().\\n * @inheritdoc ERC20Upgradeable\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n // If some L-Token have been burned/minted, inform listeners of a TVL change\\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\\n\\n // Trigger onLTokenTransfer() functions of all the transfers listeners\\n for (uint256 i = 0; i < transfersListeners.length; i++) {\\n transfersListeners[i].onLTokenTransfer(from, to, amount);\\n }\\n }\\n\\n /**\\n * @notice Computes the maximum amount of underlying tokens that should be retained\\n * by the contract (based on retention rate).\\n * @return amount The expected amount of retained underlying tokens.\\n */\\n function getExpectedRetained() public view returns (uint256 amount) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert totalSupply and retentionRate to SUD\\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\\n\\n // Compute and return expected retained amount\\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(expectedRetainedSUD, d);\\n }\\n\\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\\n function _transferExceedingToFund() internal {\\n // Retrieve the expected amount retained\\n uint256 expectedRetained = getExpectedRetained();\\n\\n // If usable underlyings are less than or equal to expected retained, return\\n if (usableUnderlyings <= expectedRetained) return;\\n\\n // Else, exceeding amount is equal to difference between those values\\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= exceedingAmount;\\n\\n // Transfer the exceeding amount to the fund wallet\\n underlying().safeTransfer(fund, exceedingAmount);\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L45\\\");\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\\n * Use deposit() function instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L46\\\");\\n }\\n\\n /**\\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\\n * @param amount The amount of underlying tokens to deposit.\\n */\\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough underlying tokens to deposit\\n require(underlying().balanceOf(_msgSender()) >= amount, \\\"L47\\\");\\n\\n // Update usable underlyings balance accordingly\\n usableUnderlyings += amount;\\n\\n // Inform listeners of the deposit activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Deposit,\\n amount,\\n amount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\\n super.depositFor(_msgSender(), amount);\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\\n * given amount.\\n * @param account The account initiating the withdrawal.\\n * @param amount The amount of the withdrawal.\\n */\\n function getWithdrawnAmountAndFees(\\n address account,\\n uint256 amount\\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\\n // If the account is eligible to staking tier 2, no fees are applied\\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\\n\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert amount and fees rate to SUD\\n uint256 amountSUD = SUD.fromAmount(amount, d);\\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\\n\\n // Compute fees and withdrawn amount (initial amount minus fees)\\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\\n fees = SUD.toAmount(feesSUD, d);\\n withdrawnAmount = amount - fees;\\n }\\n\\n /**\\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\\n * enough underlying tokens to cover the withdrawal.\\n * @dev In order to save some gas and time to users, frontends should propose this\\n * function to users only when it has been verified that it will not revert. They\\n * should propose the requestWithdrawal() function otherwise.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L48\\\");\\n\\n // Can the contract cover this withdrawal plus all already queued requests?\\n bool cond1 = totalQueued + amount <= usableUnderlyings;\\n\\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\\n\\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\\n if (!(cond1 || cond2)) revert(\\\"L49\\\");\\n\\n // Else, retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\\n\\n // Increase unclaimed fees amount accordingly\\n unclaimedFees += fees;\\n\\n // Decrease usable underlyings balance accordingly\\n usableUnderlyings -= withdrawnAmount;\\n\\n // Inform listeners of this instant withdrawal activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Burn withdrawal fees from the account\\n _burn(_msgSender(), fees);\\n\\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\\n super.withdrawTo(_msgSender(), withdrawnAmount);\\n }\\n\\n /**\\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\\n * amount of underlying tokens. The request will be automatically processed later.\\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\\n * paid by the withdrawer wallet.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function requestWithdrawal(\\n uint256 amount\\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L53\\\");\\n\\n // Ensure the requested amount doesn't overflow uint96\\n require(amount <= type(uint96).max, \\\"L54\\\");\\n\\n // Ensure the sender attached the pre-paid processing gas fees\\n require(msg.value == 0.003 * 10 ** 18, \\\"L55\\\");\\n\\n // Create withdrawal request data\\n WithdrawalRequest memory request = WithdrawalRequest({\\n account: _msgSender(),\\n amount: uint96(amount)\\n });\\n\\n // Will hold the request ID\\n uint256 requestId;\\n\\n // Append request to the withdrawal queue:\\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\\n withdrawalQueueCursor--;\\n requestId = withdrawalQueueCursor;\\n withdrawalQueue[requestId] = request;\\n }\\n // - At the end else\\n else {\\n withdrawalQueue.push(request);\\n requestId = withdrawalQueue.length - 1;\\n }\\n\\n // Increase total amount queued accordingly\\n totalQueued += amount;\\n\\n // Inform listeners of this new queued withdrawal activity event\\n emit ActivityEvent(\\n int256(requestId),\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n amount,\\n Status.Queued,\\n NO_ID\\n );\\n\\n // Burn withdrawal L-Tokens amount from account's balance\\n _burn(_msgSender(), amount);\\n\\n // Forward pre-paid processing gas fees to the withdrawer wallet\\n (bool sent, ) = withdrawer.call{value: msg.value}(\\\"\\\");\\n require(sent, \\\"L56\\\");\\n }\\n\\n /**\\n * @notice Processes queued withdrawal requests until there is else no more requests,\\n * else not enough underlying tokens to continue.\\n * @dev For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\\n */\\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\\n // Accumulators variables, will be written on-chain after the loop\\n uint256 cumulatedFees = 0;\\n uint256 cumulatedWithdrawnAmount = 0;\\n uint256 nextRequestId = withdrawalQueueCursor;\\n\\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\\n // requests are increasing the queue length when moved at the end of the queue.\\n uint256 queueLength = withdrawalQueue.length;\\n\\n // Iterate over requests to be processed\\n while (nextRequestId < queueLength) {\\n // Stop processing requests if there is not enough gas left to continue the\\n // loop and properly end the function call. This prevents an attacker from\\n // blocking the withdrawal processing by creating a ton of tiny requests so\\n // this function call cannot fit anymore in block gas limit.\\n if (gasleft() < 45000) break;\\n\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\\n\\n // Skip empty request (processed big requests or cancelled requests)\\n if (request.account == address(0)) {}\\n //\\n // If account has been blacklisted since request emission\\n else if (isBlacklisted(request.account)) {\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request in the frozen requests list\\n frozenRequests.push(request);\\n }\\n //\\n // Or if request is a big request, move it at the end of the queue for now.\\n // This request will be processed manually later using processBigQueuedRequest()\\n else if (request.amount > getExpectedRetained() / 2) {\\n // Inform listeners of this queued request being moved at the end of the queue\\n emit ActivityEvent(\\n int256(nextRequestId),\\n _msgSender(),\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Moved,\\n int256(withdrawalQueue.length)\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request at the end of the queue\\n withdrawalQueue.push(request);\\n }\\n //\\n // Else, continue request processing\\n else {\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Break if the contract doesn't hold enough funds to cover the request\\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\\n\\n // Accumulate fees and withdrawn amount\\n cumulatedFees += fees;\\n cumulatedWithdrawnAmount += withdrawnAmount;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(nextRequestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Transfer underlying tokens to account. Burning L-Tokens is not required\\n // as equestWithdrawal() already did it.\\n // Security note: Re-entrancy warning are disabled as the request has\\n // just been deleted from the queue, it will so be skipped if trying to\\n // process it again.\\n // slither-disable-next-line reentrancy-no-eth\\n underlying().safeTransfer(request.account, withdrawnAmount);\\n }\\n\\n // Increment next request ID\\n nextRequestId++;\\n }\\n\\n // Increase unclaimed fees by the amount of cumulated fees\\n unclaimedFees += cumulatedFees;\\n\\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\\n usableUnderlyings -= cumulatedWithdrawnAmount;\\n\\n // Decrease total amount queued by the cumulated amount requested\\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\\n\\n // Update new queue cursor\\n withdrawalQueueCursor = nextRequestId;\\n\\n // Retention rate cannot exceeds as the withdrawal decreases both usable\\n // underlyings and expected retained amounts by the same number and as the\\n // expected retained amount is a subset of usable underlyings amount.\\n }\\n\\n /**\\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\\n * the retention rate).\\n * @dev In contrast to non-big requests processing, this function will uses to fund\\n * wallet's balance to fill the request. This allows processing requests that are\\n * greater than retention rate without having to exceed this rate on the contract.\\n * @param requestId The ID of the big request to process.\\n */\\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure the request is active\\n require(request.account != address(0), \\\"L66\\\");\\n\\n // Ensure the request emitter has not been blacklisted since request emission\\n require(!isBlacklisted(request.account), \\\"L50\\\");\\n\\n // Ensure this is indeed a big request\\n require(request.amount > getExpectedRetained() / 2, \\\"L51\\\");\\n\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\\n uint256 fundBalance = underlying().balanceOf(fund);\\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \\\"L52\\\");\\n\\n // Increase amount of unclaimed fees accordingly\\n unclaimedFees += fees;\\n\\n // Decrease total queued amount by request amount\\n totalQueued -= request.amount;\\n\\n // Increment queue cursor if request was the next request to be processed\\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[requestId];\\n\\n // If fund wallet's balance can cover request, rely on it only\\n if (withdrawnAmount <= fundBalance) {\\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\\n }\\n // Else, cover request from both fund wallet and contract balances\\n else {\\n // Compute amount missing from fund wallet to cover request\\n uint256 missingAmount = withdrawnAmount - fundBalance;\\n\\n // Decrease usable amount of underlying tokens accordingly\\n usableUnderlyings -= missingAmount;\\n\\n // Transfer entire fund balance to request's emitter\\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\\n\\n // Transfer missing amount from contract balance to request emitter\\n underlying().safeTransfer(request.account, missingAmount);\\n }\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Cancels a given withdrawal request. The request emitter receive back its\\n * L-Tokens and no fees will be charged.\\n * @param requestId The ID of the withdrawal request to cancel.\\n */\\n function cancelWithdrawalRequest(\\n uint256 requestId\\n ) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure request belongs to caller\\n require(_msgSender() == request.account, \\\"L57\\\");\\n\\n // Decrease total amount queued accordingly\\n totalQueued -= request.amount;\\n\\n // Delete the withdrawal request from queue\\n delete withdrawalQueue[requestId];\\n\\n // Inform listeners of this cancelled withdrawal request activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Cancelled,\\n NO_ID\\n );\\n\\n // Mint back L-Tokens to account\\n _mint(request.account, uint256(request.amount));\\n }\\n\\n /**\\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\\n * whenever those are required to fulfill some withdrawal requests.\\n * @dev The function will revert if repatriated amount makes the contract exceeding\\n * the retention rate.\\n * @param amount The amount of underlying tokens to repatriate.\\n */\\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\\n // Ensure the fund wallet has enough funds to repatriate\\n require(amount <= underlying().balanceOf(fund), \\\"L58\\\");\\n\\n // Calculate new contract usable balance\\n uint256 newBalance = usableUnderlyings + amount;\\n\\n // Ensure the new balance doesn't exceed the retention rate\\n require(newBalance <= getExpectedRetained(), \\\"L59\\\");\\n\\n // Increase usable underlyings amount by repatriated amount\\n usableUnderlyings += amount;\\n\\n // Transfer amount from fund wallet to contract\\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\\n }\\n\\n /// @notice Used by owner to claim fees generated from successful withdrawals.\\n function claimFees() external onlyOwner {\\n // Ensure there are some fees to claim\\n require(unclaimedFees > 0, \\\"L60\\\");\\n\\n // Ensure the contract holds enough underlying tokens to cover fees\\n require(usableUnderlyings >= unclaimedFees, \\\"L61\\\");\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= unclaimedFees;\\n\\n // Store fees amount in memory and reset unclaimed fees amount\\n uint256 fees = unclaimedFees;\\n unclaimedFees = 0;\\n\\n // Transfer unclaimed fees to owner\\n underlying().safeTransfer(owner(), fees);\\n }\\n}\\n\",\"keccak256\":\"0x57f3b86852c72b7c6e5e57c87ae52c7532cfa0879d2985ffc249f46ff18d48e6\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalPausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalPause} from \\\"../GlobalPause.sol\\\";\\n\\n/**\\n * @title GlobalPausableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\\n * contract (see GlobalPause.sol). This design facilitates centralized management of\\n * pause state for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure\\n * The _globalPause state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalPausableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\\n /**\\n * @notice The GlobalPause contract the pause state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalPause private _globalPause;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalPause_ The address of the GlobalPause contract.\\n */\\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n }\\n\\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\\n _globalPause = GlobalPause(globalPause_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalPause contract.\\n * @return The address of the GlobalPause contract.\\n */\\n function globalPause() public view returns (address) {\\n return address(_globalPause);\\n }\\n\\n /**\\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\\n * from the GlobalPause contract instead.\\n * @return Whether the contract is paused or not.\\n */\\n function paused() public view virtual override returns (bool) {\\n return _globalPause.paused();\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xff508c0b8c48916885453b4894d0401e94580fb24fb6af1885a3e160864cde94\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalRestrictableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalBlacklist} from \\\"../GlobalBlacklist.sol\\\";\\n\\n/**\\n * @title GlobalRestrictableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a blacklist state from the specified\\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\\n * centralized management of a blacklist for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalBlacklist state must be set at initialization time and, for evident\\n * security reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalRestrictableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalRestrictableUpgradeable is Initializable {\\n /**\\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalBlacklist private _globalBlacklist;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n }\\n\\n function __GlobalRestrictable_init_unchained(\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalBlacklist contract.\\n * @return The address of the GlobalBlacklist contract.\\n */\\n function globalBlacklist() public view returns (address) {\\n return address(_globalBlacklist);\\n }\\n\\n /**\\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n */\\n modifier notBlacklisted(address account) {\\n require(isBlacklisted(account) == false, \\\"L9\\\");\\n _;\\n }\\n\\n /**\\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n * @return Whether the account is blacklisted.\\n */\\n function isBlacklisted(address account) internal view returns (bool) {\\n return _globalBlacklist.isBlacklisted(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x0032fde90d9cf23e70dd4b604ae0d1ed3283f117bc24f68d32f8933e1bd372bc\",\"license\":\"MIT\"},\"contracts/src/abstracts/InvestUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"./GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"./GlobalRestrictableUpgradeable.sol\\\";\\nimport \\\"./base/BaseUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../abstracts/RecoverableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {APRHistory as APRH} from \\\"../libs/APRHistory.sol\\\";\\nimport {SUD} from \\\"../libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title InvestUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with utilities to manage an invested token,\\n * users' investment periods, rewards calculations, virtual balances, and auto-compounding.\\n *\\n * @dev Intuition:\\n * This contract primarily exists for code splitting and reusability. It unburdens the\\n * LToken contract code, making it easier to understand and maintain.\\n *\\n * This contract is generic because it may be used in the LDYStaking contract in the future.\\n *\\n * @dev Definitions:\\n * - Investment: The act of depositing or investing tokens into the contract.\\n * - Investment period: Time between the last invested amount change and the present.\\n * - Virtual balance: Temporary storage for account rewards, used when those can't be\\n * distributed between investment periods.\\n * - Rewards redirection: Mechanism allowing an account to redirect its rewards to another.\\n *\\n * @dev Derived contract must:\\n * - Set invested token during initialization\\n * - Implement _investmentOf() function\\n * - (optionally) Implement _distributeRewards() function\\n *\\n * @dev For further details, see \\\"InvestmentUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract InvestUpgradeable is BaseUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n using APRH for APRH.Pack[];\\n\\n /**\\n * @notice Represents an account's investment period.\\n * @param timestamp The timestamp of the most recent rewards distribution.\\n * @param ref The reference of the last APR checkpoint at that timestamp.\\n */\\n struct InvestmentPeriod {\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n APRH.Reference ref;\\n }\\n\\n /**\\n * @notice Represents the investment details of an account.\\n * @param period The current investment period of the account.\\n * @param virtualBalance May hold a part of account rewards until they are claimed.\\n */\\n struct AccountDetails {\\n InvestmentPeriod period;\\n uint256 virtualBalance;\\n }\\n\\n /// @notice Holds a reference to the invested token's contract.\\n IERC20Upgradeable private _invested;\\n\\n /// @notice Holds investment details of each account.\\n mapping(address => AccountDetails) internal accountsDetails;\\n\\n /// @notice Holds an history of the APR value over time (see APRHistory.sol).\\n APRH.Pack[] private _aprHistory;\\n\\n /// @notice Holds active rewards redirections in both from->to and to->from[] ways.\\n mapping(address => address) public rewardsRedirectsFromTo;\\n mapping(address => address[]) public rewardsRedirectsToFrom;\\n\\n /// @notice Is used to prevent infinite loop in _beforeInvestmentChange().\\n bool private _isClaiming;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the APR's value.\\n * @param newAPRUD7x3 The new APR in UD7x3 format.\\n */\\n event APRChangeEvent(uint16 newAPRUD7x3);\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param invested_ The address of the invested token contract.\\n */\\n function __Invest_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address invested_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __Invest_init_unchained(invested_);\\n }\\n\\n function __Invest_init_unchained(address invested_) internal onlyInitializing {\\n // Set invested token\\n _invested = IERC20Upgradeable(invested_);\\n\\n // Define initial APR to 0%. This would prevent getAPR() from reverting because\\n // of an empty APR history\\n _aprHistory.setAPR(0);\\n }\\n\\n /**\\n * @notice Retrieves the reference to the invested token contract.\\n * @return The reference to the invested token contract.\\n */\\n function invested() public view returns (IERC20Upgradeable) {\\n return _invested;\\n }\\n\\n /**\\n * @notice Updates the investment APR. Restricted to owner.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(uint16 aprUD7x3) public onlyOwner {\\n _aprHistory.setAPR(aprUD7x3);\\n emit APRChangeEvent(aprUD7x3);\\n }\\n\\n /**\\n * @notice Retrieves the most recently set APR.\\n * @return The current APR in UD7x3 format.\\n */\\n function getAPR() public view returns (uint16) {\\n return _aprHistory.getAPR();\\n }\\n\\n /**\\n * @notice Enables redirection of rewards from one account to another.\\n * @param from The address of the account to redirect rewards from.\\n * @param to The address of the account to redirect rewards to.\\n */\\n function startRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure the address is not already redirecting rewards\\n require(rewardsRedirectsFromTo[from] == address(0), \\\"L62\\\");\\n\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L12\\\");\\n require(to != address(0), \\\"L13\\\");\\n\\n // Ensure 'from' and 'to' addresses are distinct\\n require(from != to, \\\"L14\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L15\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Activate rewards redirection\\n rewardsRedirectsFromTo[from] = to;\\n rewardsRedirectsToFrom[to].push(from);\\n }\\n\\n /**\\n * @notice Disable an active rewards redirection.\\n * @param from The address of the account to stop redirecting rewards from.\\n * @param to The address of the account to stop redirecting rewards to.\\n */\\n function stopRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L16\\\");\\n require(to != address(0), \\\"L17\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L18\\\");\\n\\n // Ensure a rewards redirection was active\\n require(rewardsRedirectsFromTo[from] == to, \\\"L19\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Retrieve 'from' index in the redirection array of 'to'\\n int256 fromIndex = -1;\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[to].length; i++) {\\n if (rewardsRedirectsToFrom[to][i] == from) {\\n fromIndex = int256(i);\\n break;\\n }\\n }\\n\\n // fromIndex should never be -1 at this point\\n assert(fromIndex >= 0);\\n\\n // Deactivate rewards redirection\\n rewardsRedirectsFromTo[from] = address(0);\\n rewardsRedirectsToFrom[to][uint256(fromIndex)] = rewardsRedirectsToFrom[to][\\n rewardsRedirectsToFrom[to].length - 1\\n ];\\n rewardsRedirectsToFrom[to].pop();\\n }\\n\\n /**\\n * @notice Retrieves the total amount of tokens invested by the given account.\\n * @dev Derived contracts must implement this function.\\n * @param account The account to get the investment of.\\n * @return The total amount of tokens invested by the given account.\\n */\\n function _investmentOf(address account) internal view virtual returns (uint256);\\n\\n /**\\n * @notice Distributes a specified amount of rewards to a given account.\\n * @dev Derived contracts may optionally implement this function.\\n * @dev Implementations must return true to indicate a successful distribution, and\\n * false otherwise. If it returns false, the rewards will be added to the account's\\n * virtual balance, in order to be claimed later.\\n * @param account The account to claim the rewards of.\\n * @param amount The amount of rewards to claim.\\n * @return Whether the rewards distribution was successfull.\\n */\\n function _distributeRewards(address account, uint256 amount) internal virtual returns (bool) {\\n account; // Silence unused variables warning\\n amount;\\n return false;\\n }\\n\\n /**\\n * @notice Computes the rewards accrued over a specified period of time, based on a\\n * given APR and amount of invested tokens.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param beginTimestamp The moment the period commenced.\\n * @param endTimestamp The moment the period concluded.\\n * @param aprUD7x3 The APR during this period, in UD7x3 format.\\n * @param investedAmount The amount of tokens deposited/invested during the period.\\n * @return The amount of rewards generated during the period.\\n */\\n function _calculatePeriodRewards(\\n uint40 beginTimestamp,\\n uint40 endTimestamp,\\n uint16 aprUD7x3,\\n uint256 investedAmount\\n ) internal view returns (uint256) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Compute the number of elapsed years\\n uint256 elapsedTimeSUD = SUD.fromInt(endTimestamp - beginTimestamp, d);\\n uint256 elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1, d)) / SUD.fromInt(365 days, d);\\n\\n // Compute the growth in invested amount (thanks to rewards)\\n uint256 aprSUD = SUD.fromRate(aprUD7x3, d);\\n uint256 growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1, d);\\n\\n // Compute and return the rewards\\n uint256 investedAmountSUD = SUD.fromAmount(investedAmount, d);\\n uint256 rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(rewardsSUD, d);\\n }\\n\\n /**\\n * @notice Computes the sum of given account's invested amount, plus invested amount\\n * of all accounts that recursively redirect rewards to this account.\\n * @param account The account to calculate the deep investment of.\\n * @return deepInvestedAmount The deep invested amount.\\n */\\n function _deepInvestmentOf(address account) internal view returns (uint256 deepInvestedAmount) {\\n // Consider account's direct investment\\n deepInvestedAmount += _investmentOf(account);\\n\\n // But also the deep investments of all accounts redirecting rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n deepInvestedAmount += _deepInvestmentOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Computes the amount of unclaimed/undistributed rewards of a given account.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param account The account to calculate the unclaimed rewards of.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n * @return rewards The amount of unclaimed/undistributed rewards of the given account.\\n */\\n function _rewardsOf(\\n address account,\\n bool autocompound\\n ) internal view returns (uint256 rewards) {\\n // Retrieve account's investment details\\n AccountDetails memory details = accountsDetails[account];\\n\\n // Retrieve account's deep invested amount\\n uint256 investedAmount = _deepInvestmentOf(account);\\n\\n // Return 0 if the account has never invested or has no invested amount\\n if (details.period.timestamp == 0 || investedAmount == 0) return 0;\\n\\n // Retrieve reference and data of APR checkpoint at which started investment period\\n APRH.Reference memory currRef = details.period.ref;\\n APRH.CheckpointData memory currCheckpoint = _aprHistory.getDataFromReference(currRef);\\n\\n // Retrieve reference of latest APR checkpoint\\n APRH.Reference memory latestRef = _aprHistory.getLatestReference();\\n\\n // 1) Fill rewards with virtual balance (rewards not claimed/distributed yet)\\n // See \\\"InvestUpgradeable > Yield calculation > 1)\\\" section of the whitepaper\\n rewards = details.virtualBalance;\\n\\n // If start checkpoint is not the latest one\\n if (!APRH.eq(currRef, latestRef)) {\\n // Retrieve reference and data of APR checkpoint that comes after start checkpoint\\n APRH.Reference memory nextRef = APRH.incrementReference(currRef);\\n APRH.CheckpointData memory nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // 2) Calculate rewards from investment period start to next checkpoint\\n // See \\\"InvestUpgradeable > Yield calculation > 2)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n\\n // 3) Calculate rewards for each crossed pair of checkpoints\\n // See \\\"InvestUpgradeable > Yield calculation > 3)\\\" section of the whitepaper\\n while (true) {\\n // Set next checkpoint as the current one\\n currRef = nextRef;\\n currCheckpoint = nextCheckpoint;\\n\\n // Break if current checkpoint is the latest one\\n if (APRH.eq(currRef, latestRef)) break;\\n\\n // Else, retrieve the new next checkpoint\\n nextRef = APRH.incrementReference(currRef);\\n nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // Calculate rewards between the current pair of checkpoints\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n\\n // 4) Calculate rewards from the latest checkpoint to now\\n // See \\\"InvestUpgradeable > Yield calculation > 4)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n } else {\\n // 2.bis) Calculate rewards from investment period start to now\\n // See \\\"InvestUpgradeable > Yield calculation > 2.bis)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n }\\n\\n /**\\n * @notice Recursively resets the investment period of the specified account and of\\n * all accounts that directly or indirectly redirect rewards to this account.\\n * @param account The account to deeply reset the investment period of.\\n */\\n function _deepResetInvestmentPeriodOf(address account) internal {\\n // Reset account investment period timestamp and APR checkpoint to latest ones\\n accountsDetails[account].period.timestamp = uint40(block.timestamp);\\n accountsDetails[account].period.ref = _aprHistory.getLatestReference();\\n\\n // Also reset the ones of all accounts that recursively redirect rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n _deepResetInvestmentPeriodOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Hook to be invoked before the invested amount of an account changes. It\\n * ensures that rewards are distributed and that account's investment period is reset.\\n * @param account The account whose invested amount is going to change.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n */\\n function _beforeInvestmentChange(address account, bool autocompound) internal {\\n // This hook is called inside LToken._beforeTokenTransfer() and as new tokens are\\n // minted in LToken._distributeRewards(), this guards against infinite loop.\\n if (_isClaiming) return;\\n\\n // LToken._beforeTokenTransfer() calls this hook for both involved addresses.\\n // As first call will treat both addresses, the second call would be redundant.\\n // Therefore, we skip accounts already processed in this block to save up some gas.\\n if (accountsDetails[account].period.timestamp == uint40(block.timestamp)) return;\\n\\n // If account redirects its rewards\\n address redirectRewardsTo = rewardsRedirectsFromTo[account];\\n if (redirectRewardsTo != address(0)) {\\n // Call hook on redirection target (this will indirectly reset the investment\\n // of this source account) and return\\n _beforeInvestmentChange(redirectRewardsTo, autocompound);\\n return;\\n }\\n\\n // Else, compute account's undistributed/unclaimed rewards\\n uint256 rewards = _rewardsOf(account, autocompound);\\n\\n // If there are some rewards\\n if (rewards > 0) {\\n // Try to distribute rewards to account\\n _isClaiming = true;\\n bool distributed = _distributeRewards(account, rewards);\\n _isClaiming = false;\\n\\n // If rewards have not been distributed, accumulate them in account's virtual balance\\n if (!distributed) accountsDetails[account].virtualBalance = rewards;\\n }\\n\\n // Finally, deeply reset investment period of the account\\n _deepResetInvestmentPeriodOf(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xdb6d0b0e2f2546b6be0ac9244e99017c5e5da1e5b7783d6fff50f4217b9ec820\",\"license\":\"MIT\"},\"contracts/src/abstracts/RecoverableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Conracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title RecoverableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with helper functions allowing the recovery of\\n * assets accidentally sent to them.\\n *\\n * @dev Where are utilities Ether, ERC721, etc.?\\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\\n * in this codebase currently do not implement the necessary functions to receive Ether\\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\\n *\\n * @dev For further details, see \\\"RecoverableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init(globalOwner_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Recoverable_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Recovers a specified amount of a given token address. Will fail if the\\n * contract doesn't hold enough tokens.\\n * @param tokenAddress The address of the token to recover.\\n * @param amount The amount of token to recover.\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\\n // Ensure the specified amount is not zero\\n require(amount > 0, \\\"L10\\\");\\n\\n // Create a reference to token's contract\\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\\n\\n // Ensure there is enough token to recover\\n require(tokenContract.balanceOf(address(this)) >= amount, \\\"L11\\\");\\n\\n // Transfer the recovered token amount to the sender\\n tokenContract.safeTransfer(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xc70110d1284c9e4aa7c518b3b98682dd9edbe6f6fb23761d825554ba41a80d5e\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"../GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"../GlobalRestrictableUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../RecoverableUpgradeable.sol\\\";\\n\\n/**\\n * @title BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\\n * minimizing code repetition and enhancing readability and maintainability.\\n *\\n * @dev For further details, see \\\"Base\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract BaseUpgradeable is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n GlobalPausableUpgradeable,\\n GlobalRestrictableUpgradeable,\\n RecoverableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xe445c759682f31d39e63663ff8217072c0e81086bda11ea473247be334c3e424\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/ERC20BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\nimport {ERC20PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"./BaseUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\n\\n/**\\n * @title ERC20BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract is an extension of BaseUpgradeable intended to be used\\n * as a base for ERC20 tokens contracts.\\n *\\n * @dev For further details, see \\\"ERC20BaseUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract ERC20BaseUpgradeable is\\n ERC20Upgradeable,\\n BaseUpgradeable,\\n ERC20PausableUpgradeable\\n{\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param name_ The display name of the token.\\n * @param symbol_ The symbol of the token.\\n */\\n function __ERC20Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __ERC20_init(name_, symbol_);\\n __ERC20Pausable_init_unchained();\\n }\\n\\n function __ERC20Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and PausableUpgradeable parent contracts.\\n * The GlobalPausableUpgradeable version is preferred because it checks the pause\\n * state from the GlobalPause contract.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, PausableUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @dev Required override of _beforeTokenTransfer() which is implemented by both\\n * ERC20PausableUpgradeable and ERC20Upgradeable parent contracts.\\n * The ERC20PausableUpgradeable version is preferred because it also checks that\\n * the contract is not paused before allowing the transfer.\\n * @inheritdoc ERC20PausableUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n )\\n internal\\n virtual\\n override(ERC20PausableUpgradeable, ERC20Upgradeable)\\n whenNotPaused\\n notBlacklisted(from)\\n notBlacklisted(to)\\n {\\n ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xa69b9acca2902fcfe513889516fcffc830903fc3c6a3a11e2ad8da7460201378\",\"license\":\"MIT\"},\"contracts/src/interfaces/ITransfersListener.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\ninterface ITransfersListener {\\n function onLTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0xf1d4172da97ccaf7199601dd9bdb2ac92a49b6977ec34bba010af37f662549fb\",\"license\":\"MIT\"},\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"},\"contracts/src/libs/SUD.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title SUD\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice SUD serves as an intermediary number format for calculations within this\\n * codebase. It ensures consistency and reduces precision losses. This library\\n * facilitates conversions between various number formats and the SUD format.\\n *\\n * @dev Intuition:\\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\\n * represent both percentage rates and tokens amounts.\\n *\\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\\n * the decimals() value of the involved tokens.\\n *\\n * Three challenges arise from this:\\n * 1) To compute values together, it's essential that they are in the same format\\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\\n * precision loss (because division shrinks). A common approach is to scale up and\\n * down values by a few decimals before and after performing calculations.\\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\\n * be shrunk in case token's decimals number is in [0, 2].\\n *\\n * To address these challenges, this library provides the SUD format, which acts as a\\n * consistent and scaled intermediate format to perform calculations.\\n *\\n * SUD is an acronym for either \\\"Scaled UD\\\" or \\\"Safe UD\\\".\\n *\\n * @dev Definitions:\\n * - Integer: A number without fractional part, e.g., block.timestamp\\n * - UD: A decimal unsigned fixed-point number. The \\\"UD\\\" notation is inspired from\\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\\n * and fractional parts (as token amounts have variable decimal numbers)\\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\\n * with 3 more decimals than the involved UD with the highest decimals number. As\\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\\n * so ranges from UD71x6 to UD0x77 formats.\\n *\\n * @dev A conversion library:\\n * This library provides utilities to perform the following conversions:\\n * - Amount <--> SUD\\n * - Rate (UD7x3) <--> SUD\\n * - Integer <--> SUD\\n *\\n * @dev Why scaling by 3 decimals?\\n * - It provides an adequate degree of precision for this codebase,\\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\\n * the involved token's decimal number, so is gas efficient.\\n *\\n * @dev Why internal functions?\\n * The functions of this library are not set to external because incorporating them\\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\\n * from making them external are negated by the additional bytecode required for external\\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\\n * when those functions's visibility is set to external or internal.\\n *\\n * @dev Precision warning:\\n * While this library mitigates precision loss during calculations on UD numbers, it's\\n * important to note that tokens with lower decimal counts and supply inherently suffer\\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\\n * will experience less precision loss.\\n *\\n * @dev For further details, see \\\"SUD\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary SUD {\\n /**\\n * @notice Retrieves decimals number of the given ERC20 contract address.\\n * @param tokenAddress The address to retrieve decimals number from.\\n * @return decimals The decimals number of the given ERC20 contract address.\\n */\\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\\n }\\n\\n /**\\n * @notice Convert a given token amount into SUD format.\\n * @param nAmount The token amount to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The amount in SUD format\\n */\\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\\n\\n // Else return a number with decimals+3 fractional digits\\n return nAmount * 10 ** 3;\\n }\\n\\n /**\\n * @notice Convert a given SUD number into token amount format.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nAmount The number in amount format\\n */\\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** 3;\\n }\\n\\n /**\\n * @notice Converts a given UD7x3 rate into SUD format.\\n * @param nUD7x3 The UD7x3 rate to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The rate in SUD format.\\n */\\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nUD7x3 * 10 ** 3;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return nUD7x3 * 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given SUD number into a UD7x3 rate.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nUD7x3 The number in UD7x3 rate format.\\n */\\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 3;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given integer into SUD format.\\n * @param n The integer to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The integer in SUD format.\\n */\\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return n * 10 ** 6;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return n * 10 ** (decimals + 3);\\n }\\n\\n /**\\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return n The SUD number as an integer.\\n */\\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 6;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** (decimals + 3);\\n }\\n}\\n\",\"keccak256\":\"0x7297fc67064b5925e26fa5ed3a4ba4b0f64a9162fdf0ebc2aac8649fddce543a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051615f916200011f60003960008181611462015281816114a2015281816118fd0152818161193d01526119d00152615f916000f3fe6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff82166024820152739b508ABEbB61a0C24d28A728BB45834e440e47619063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b81526102906004820152600090739b508ABEbB61a0C24d28A728BB45834e440e47619063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b8152610290600482015260006024820152739b508ABEbB61a0C24d28A728BB45834e440e47619063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b8152600090739b508ABEbB61a0C24d28A728BB45834e440e47619063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b81526102906004820152909150600090739b508ABEbB61a0C24d28A728BB45834e440e476190630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b905084602001519550739b508ABEbB61a0C24d28A728BB45834e440e4761634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b8152600090739b508ABEbB61a0C24d28A728BB45834e440e476190637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b8152909150600090739b508ABEbB61a0C24d28A728BB45834e440e47619063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b819450809350739b508ABEbB61a0C24d28A728BB45834e440e4761634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b8152739b508ABEbB61a0C24d28A728BB45834e440e476190637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b8152909250739b508ABEbB61a0C24d28A728BB45834e440e47619063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b81526102906004820152739b508ABEbB61a0C24d28A728BB45834e440e476190630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a2646970667358221220fbb2af90b8f04e19fedd1f5228dc92dc3d464b1deb72d9e4cef2afd46b71093464736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff8216602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b8152610290600482015260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b815261029060048201526000602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b8152610290600482015290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b90508460200151955073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b815290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b81945080935073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b815273__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b815290925073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b8152610290600482015273__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a2646970667358221220fbb2af90b8f04e19fedd1f5228dc92dc3d464b1deb72d9e4cef2afd46b71093464736f6c63430008120033", + "libraries": { + "APRHistory": "0x9b508ABEbB61a0C24d28A728BB45834e440e4761" + }, + "devdoc": { + "author": "Lila Rest (https://lila.rest)", + "custom:oz-upgrades-unsafe-allow": "external-library-linking", + "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", + "details": "Definitions: - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio). - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees). - Instant: Processed immediately. - Request: Queued for later processing. - Big Request: A requested withdrawal exceeding half of the retention rate. - (Withdrawal) queue: A list of all requested withdrawals sorted by priority. - Request ID: The index of a withdrawal request in the queue array. - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain. - Fees Rate: Percentage of fees applied to successful withdrawals. - Usable underlyings: Amount of underlying tokens that have been deposited through expected ways and are so considered safe to use by the contract. - Transfers listeners: External contracts listening on L-Tokens transfers. - Fund wallet: Wallet managed by the Ledgity's financial team. - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request processing. Note that words between parenthesis are sometimes omitted for brevity.Deployment notice: This contract can safely receive funds immediately after initialization. (i.e., there is no way for funds to be sent to non-owned addresses). It is, however, recommended to replace ASAP owner and fund wallets with multi-sig wallets.For further details, see \"LToken\" section of whitepaper.", + "events": { + "APRChangeEvent(uint16)": { + "params": { + "newAPRUD7x3": "The new APR in UD7x3 format." + } + }, + "ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)": { + "params": { + "account": "The account involved in the activity.", + "action": "The type of activity.", + "amount": "The amount of underlying tokens involved in the activity.", + "id": "ID of the involved withdrawal request or NO_ID (-1) if not applicable.", + "newId": "The new ID of the request if it has been moved in the queue.", + "newStatus": "The new status of the activity." + } + }, + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "MintedRewardsEvent(address,uint256,uint256)": { + "params": { + "account": "The account that received the rewards.", + "balanceBefore": "The balance of the account before the minting.", + "rewards": "The amount of minted rewards." + } + }, + "Paused(address)": { + "details": "Emitted when the pause is triggered by `account`." + }, + "TVLChangeEvent(uint256)": { + "details": "TVL = realTotalSupply()", + "params": { + "newTVL": "The new TVL of the contract." + } + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + }, + "Unpaused(address)": { + "details": "Emitted when the pause is lifted by `account`." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "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": "This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have not been yet minted to the specified account.", + "params": { + "account": "The account to check the total balance of." + }, + "returns": { + "_0": "The total balance of the account." + } + }, + "cancelWithdrawalRequest(uint256)": { + "params": { + "requestId": "The ID of the withdrawal request to cancel." + } + }, + "decimals()": { + "details": "The ERC20WrapperUpgradeable version is preferred because it mirrors the decimals amount of the underlying stablecoin token." + }, + "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`." + }, + "deposit(uint256)": { + "params": { + "amount": "The amount of underlying tokens to deposit." + } + }, + "depositFor(address,uint256)": { + "details": "Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens." + }, + "getAPR()": { + "returns": { + "_0": "The current APR in UD7x3 format." + } + }, + "getExpectedRetained()": { + "returns": { + "amount": "The expected amount of retained underlying tokens." + } + }, + "getWithdrawnAmountAndFees(address,uint256)": { + "params": { + "account": "The account initiating the withdrawal.", + "amount": "The amount of the withdrawal." + } + }, + "globalBlacklist()": { + "returns": { + "_0": "The address of the GlobalBlacklist contract." + } + }, + "globalOwner()": { + "returns": { + "_0": "The address of the GlobalOwner contract." + } + }, + "globalPause()": { + "returns": { + "_0": "The address of the GlobalPause contract." + } + }, + "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,address,address,address,address)": { + "details": "See: https://docs.openzeppelin.com/contracts/4.x/upgradeable", + "params": { + "globalBlacklist_": "The address of the GlobalBlacklist contract.", + "globalOwner_": "The address of the GlobalOwner contract.", + "globalPause_": "The address of the GlobalPause contract.", + "underlyingToken": "The address of the underlying stablecoin ERC20 token." + } + }, + "instantWithdrawal(uint256)": { + "details": "In order to save some gas and time to users, frontends should propose this function to users only when it has been verified that it will not revert. They should propose the requestWithdrawal() function otherwise.", + "params": { + "amount": "The amount L-Tokens to withdraw." + } + }, + "invested()": { + "returns": { + "_0": "The reference to the invested token contract." + } + }, + "listenToTransfers(address)": { + "details": "Each time a transfer occurs, the onLTokenTransfer() function of the specified contract will be called.IMPORTANT SECURITY NOTE: This method is not intended to be used with contracts that are not owned by the Ledgity team.", + "params": { + "listenerContract": "The address of the new transfers listener contract." + } + }, + "name()": { + "details": "Returns the name of the token." + }, + "owner()": { + "returns": { + "_0": "The address of the owner" + } + }, + "paused()": { + "details": "Both version are the same as ERC20BaseUpgradeable.paused() mirrors GlobalPausableUpgradeable.paused(), so a random one is chosen.", + "returns": { + "_0": "Whether the contract is paused or not." + } + }, + "processBigQueuedRequest(uint256)": { + "details": "In contrast to non-big requests processing, this function will uses to fund wallet's balance to fill the request. This allows processing requests that are greater than retention rate without having to exceed this rate on the contract.", + "params": { + "requestId": "The ID of the big request to process." + } + }, + "processQueuedRequests()": { + "details": "For further details, see \"LToken > Withdrawals\" section of whitepaper." + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "realBalanceOf(address)": { + "params": { + "account": "The account to check the real balance of." + }, + "returns": { + "_0": "The real balance of the account." + } + }, + "realTotalSupply()": { + "returns": { + "_0": "The real total supply of L-Tokens." + } + }, + "recoverERC20(address,uint256)": { + "details": "This override of RecoverableUpgradeable.recoverERC20() prevents the recovered token from being the underlying token.", + "params": { + "amount": "The amount of token to recover.", + "tokenAddress": "The address of the token to recover." + } + }, + "recoverUnderlying()": { + "details": "To prevent owner from being able to drain the contract, this function only allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been sent through fund() or deposit() functions." + }, + "repatriate(uint256)": { + "details": "The function will revert if repatriated amount makes the contract exceeding the retention rate.", + "params": { + "amount": "The amount of underlying tokens to repatriate." + } + }, + "requestWithdrawal(uint256)": { + "details": "The sender must attach 0.003 ETH to pre-pay the future processing gas fees paid by the withdrawer wallet.", + "params": { + "amount": "The amount L-Tokens to withdraw." + } + }, + "setAPR(uint16)": { + "params": { + "aprUD7x3": "The new APR in UD7x3 format." + } + }, + "setFeesRate(uint32)": { + "params": { + "feesRateUD7x3_": "The new withdrawal fee rate in UD7x3 format." + } + }, + "setFund(address)": { + "params": { + "fund_": "The address of the new fund wallet." + } + }, + "setLDYStaking(address)": { + "params": { + "ldyStakingAddress": "The address of the new LDYStaking contract." + } + }, + "setRetentionRate(uint32)": { + "details": "The retention rate is capped at 10%, which ensures that no more than 10% of deposited assets will ever be exposed in this contract (reduces attack surface).", + "params": { + "retentionRateUD7x3_": "The new retention rate in UD7x3 format." + } + }, + "setWithdrawer(address)": { + "params": { + "withdrawer_": "The address of the new withdrawer wallet." + } + }, + "startRewardsRedirection(address,address)": { + "params": { + "from": "The address of the account to redirect rewards from.", + "to": "The address of the account to redirect rewards to." + } + }, + "stopRewardsRedirection(address,address)": { + "params": { + "from": "The address of the account to stop redirecting rewards from.", + "to": "The address of the account to stop redirecting rewards to." + } + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "returns": { + "_0": "The total supply of L-Tokens." + } + }, + "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`." + }, + "underlying()": { + "details": "Returns the address of the underlying ERC-20 token that is being wrapped." + }, + "unlistenToTransfers(address)": { + "details": "The onLTokenTransfer() function of the specified contract will not be called anymore each time a L-Token transfer occurs.", + "params": { + "listenerContract": "The address of the listener contract." + } + }, + "unmintedRewardsOf(address)": { + "details": "This is a public implementation of InvestUpgradeable_rewardsOf(). In the context of LToken, this function returns the amount of rewards that have not been distributed/minted yet to the specified account.This is particularly useful for off-chain services to display charts and statistics, as seen in the Ledgity Yield's frontend.", + "params": { + "account": "The account to check the unminted rewards of." + }, + "returns": { + "_0": "The amount of account's unminted rewards." + } + }, + "upgradeTo(address)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + }, + "withdrawTo(address,uint256)": { + "details": "Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens." + } + }, + "stateVariables": { + "frozenRequests": { + "details": "If a request emitter as been blacklisted, its request is moved here to prevent it from blocking the queue." + }, + "transfersListeners": { + "details": "onLTokenTransfer() functions of those contracts will be called on each transfer." + }, + "usableUnderlyings": { + "details": "Are usable, only underlying tokens deposit through deposit() or fund() functions." + } + }, + "title": "LToken", + "version": 1 + }, + "userdoc": { + "events": { + "APRChangeEvent(uint16)": { + "notice": "Emitted to inform listeners about a change in the APR's value." + }, + "ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)": { + "notice": "Emitted to inform listerners about an activity related to deposits and withdrawals." + }, + "MintedRewardsEvent(address,uint256,uint256)": { + "notice": "Emitted to inform listeners that some rewards have been minted." + }, + "TVLChangeEvent(uint256)": { + "notice": "Emitted to inform listeners about a change in the contract's TVL." + } + }, + "kind": "user", + "methods": { + "balanceOf(address)": { + "notice": "Retrieves the total balance of L-Tokens that belong to the account." + }, + "cancelWithdrawalRequest(uint256)": { + "notice": "Cancels a given withdrawal request. The request emitter receive back its L-Tokens and no fees will be charged." + }, + "claimFees()": { + "notice": "Used by owner to claim fees generated from successful withdrawals." + }, + "decimals()": { + "notice": "Required override of decimals() which is implemented by both ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts." + }, + "deposit(uint256)": { + "notice": "Allows exchanging some underlying tokens for the same amount of L-Tokens." + }, + "depositFor(address,uint256)": { + "notice": "Override of ERC20WrapperUpgradeable.depositFor() that reverts. Use deposit() function instead." + }, + "feesRateUD7x3()": { + "notice": "Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%)." + }, + "frozenRequests(uint256)": { + "notice": "Holds a list of all currently frozen withdrawal requests." + }, + "fund()": { + "notice": "Holds address of fund wallet (managed by Ledgity financial team)." + }, + "getAPR()": { + "notice": "Retrieves the most recently set APR." + }, + "getExpectedRetained()": { + "notice": "Computes the maximum amount of underlying tokens that should be retained by the contract (based on retention rate)." + }, + "getWithdrawnAmountAndFees(address,uint256)": { + "notice": "Computes fees and net withdrawn amount for a given account withdrawing a given amount." + }, + "globalBlacklist()": { + "notice": "Retrieves the address of GlobalBlacklist contract." + }, + "globalOwner()": { + "notice": "Retrieves the address of GlobalOwner contract." + }, + "globalPause()": { + "notice": "Retrieves the address of GlobalPause contract." + }, + "initialize(address,address,address,address,address)": { + "notice": "Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts." + }, + "instantWithdrawal(uint256)": { + "notice": "Allows instaneously exchanging a given amount of L-Tokens for the same amount of underlying tokens. It will fail if the contract currently doesn't hold enough underlying tokens to cover the withdrawal." + }, + "invested()": { + "notice": "Retrieves the reference to the invested token contract." + }, + "ldyStaking()": { + "notice": "Holds a reference to the LDYStaking contract." + }, + "listenToTransfers(address)": { + "notice": "Adds a new contract to the L-Token transfers list." + }, + "owner()": { + "notice": "Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead." + }, + "paused()": { + "notice": "Required override of paused() which is implemented by both GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts." + }, + "processBigQueuedRequest(uint256)": { + "notice": "Processes a given queued big withdrawal request (one that exceeds half of the retention rate)." + }, + "processQueuedRequests()": { + "notice": "Processes queued withdrawal requests until there is else no more requests, else not enough underlying tokens to continue." + }, + "realBalanceOf(address)": { + "notice": "Retrieves the \"real\" balance of an account, i.e., excluding its not yet minted/distributed rewards." + }, + "realTotalSupply()": { + "notice": "Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue." + }, + "recoverERC20(address,uint256)": { + "notice": "Recovers a specified amount of a given token address." + }, + "recoverUnderlying()": { + "notice": "Recovers underlying tokens accidentally sent to the contract." + }, + "renounceOwnership()": { + "notice": "Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "repatriate(uint256)": { + "notice": "Used by the fund wallet to repatriate underlying tokens on the contract whenever those are required to fulfill some withdrawal requests." + }, + "requestWithdrawal(uint256)": { + "notice": "Allows requesting the exchange of a given amount of L-Tokens for the same amount of underlying tokens. The request will be automatically processed later." + }, + "retentionRateUD7x3()": { + "notice": "Holds the retention rate in UD7x3 format." + }, + "rewardsRedirectsFromTo(address)": { + "notice": "Holds active rewards redirections in both from->to and to->from[] ways." + }, + "setAPR(uint16)": { + "notice": "Updates the investment APR. Restricted to owner." + }, + "setFeesRate(uint32)": { + "notice": "Updates the current withdrawal fee rate." + }, + "setFund(address)": { + "notice": "Updates the address of the fund wallet." + }, + "setLDYStaking(address)": { + "notice": "Updates the address of LDYStaking contract." + }, + "setRetentionRate(uint32)": { + "notice": "Updates the current underlying token retention rate." + }, + "setWithdrawer(address)": { + "notice": "Updates the address of the withdrawer wallet." + }, + "startRewardsRedirection(address,address)": { + "notice": "Enables redirection of rewards from one account to another." + }, + "stopRewardsRedirection(address,address)": { + "notice": "Disable an active rewards redirection." + }, + "totalQueued()": { + "notice": "Holds the amount of L-Tokens currently in the withdrawal queue." + }, + "totalSupply()": { + "notice": "Retrives the total supply of L-Tokens, including not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue." + }, + "transferOwnership(address)": { + "notice": "Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there." + }, + "transfersListeners(uint256)": { + "notice": "Holds a list of contracts' references that are listening to L-Tokens transfers." + }, + "unclaimedFees()": { + "notice": "Holds the amount of withdrawal fees not yet claimed by contract's owner." + }, + "unlistenToTransfers(address)": { + "notice": "Removes a contract from the L-Token transfers list." + }, + "unmintedRewardsOf(address)": { + "notice": "Retrieves the amount of given account's not yet minted rewards." + }, + "usableUnderlyings()": { + "notice": "Holds the amount of underlying tokens considered as usable by the contract." + }, + "withdrawTo(address,uint256)": { + "notice": "Override of ERC20WrapperUpgradeable.withdrawTo() that reverts. Use instantWithdrawal() or requestWithdrawal() functions instead." + }, + "withdrawalQueue(uint256)": { + "notice": "Holds an ordered list of active withdrawal requests." + }, + "withdrawalQueueCursor()": { + "notice": "Holds the index of the next withdrawal request to process in the queue." + }, + "withdrawer()": { + "notice": "Holds address of withdrawer wallet (managed by withdrawal server)." + } + }, + "notice": "Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e., investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin. As soon as a wallet holds some L-Tokens, it starts receiving rewards in the form of additional L-Tokens, which are auto-compounded over time.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 609, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 612, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 591, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 906, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2869, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 1137, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_balances", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 1143, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_allowances", + "offset": 0, + "slot": "152", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 1145, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_totalSupply", + "offset": 0, + "slot": "153", + "type": "t_uint256" + }, + { + "astId": 1147, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_name", + "offset": 0, + "slot": "154", + "type": "t_string_storage" + }, + { + "astId": 1149, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_symbol", + "offset": 0, + "slot": "155", + "type": "t_string_storage" + }, + { + "astId": 1729, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "156", + "type": "t_array(t_uint256)45_storage" + }, + { + "astId": 928, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_paused", + "offset": 0, + "slot": "201", + "type": "t_bool" + }, + { + "astId": 1033, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 116, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address" + }, + { + "astId": 236, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 7922, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_globalOwner", + "offset": 0, + "slot": "301", + "type": "t_contract(GlobalOwner)4308" + }, + { + "astId": 8006, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "302", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 8024, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_globalPause", + "offset": 0, + "slot": "352", + "type": "t_contract(GlobalPause)4384" + }, + { + "astId": 8083, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "353", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 8097, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_globalBlacklist", + "offset": 0, + "slot": "403", + "type": "t_contract(GlobalBlacklist)4261" + }, + { + "astId": 8171, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "404", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9190, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "454", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9281, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "504", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 1867, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "554", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9386, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "604", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 8223, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_invested", + "offset": 0, + "slot": "654", + "type": "t_contract(IERC20Upgradeable)1808" + }, + { + "astId": 8229, + "contract": "contracts/src/LToken.sol:LToken", + "label": "accountsDetails", + "offset": 0, + "slot": "655", + "type": "t_mapping(t_address,t_struct(AccountDetails)8219_storage)" + }, + { + "astId": 8234, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_aprHistory", + "offset": 0, + "slot": "656", + "type": "t_array(t_struct(Pack)9418_storage)dyn_storage" + }, + { + "astId": 8239, + "contract": "contracts/src/LToken.sol:LToken", + "label": "rewardsRedirectsFromTo", + "offset": 0, + "slot": "657", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 8244, + "contract": "contracts/src/LToken.sol:LToken", + "label": "rewardsRedirectsToFrom", + "offset": 0, + "slot": "658", + "type": "t_mapping(t_address,t_array(t_address)dyn_storage)" + }, + { + "astId": 8247, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_isClaiming", + "offset": 0, + "slot": "659", + "type": "t_bool" + }, + { + "astId": 9097, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "660", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 1881, + "contract": "contracts/src/LToken.sol:LToken", + "label": "_underlying", + "offset": 0, + "slot": "710", + "type": "t_contract(IERC20Upgradeable)1808" + }, + { + "astId": 2060, + "contract": "contracts/src/LToken.sol:LToken", + "label": "__gap", + "offset": 0, + "slot": "711", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 5357, + "contract": "contracts/src/LToken.sol:LToken", + "label": "ldyStaking", + "offset": 0, + "slot": "761", + "type": "t_contract(LDYStaking)5289" + }, + { + "astId": 5360, + "contract": "contracts/src/LToken.sol:LToken", + "label": "withdrawer", + "offset": 0, + "slot": "762", + "type": "t_address_payable" + }, + { + "astId": 5363, + "contract": "contracts/src/LToken.sol:LToken", + "label": "fund", + "offset": 0, + "slot": "763", + "type": "t_address" + }, + { + "astId": 5366, + "contract": "contracts/src/LToken.sol:LToken", + "label": "feesRateUD7x3", + "offset": 20, + "slot": "763", + "type": "t_uint32" + }, + { + "astId": 5369, + "contract": "contracts/src/LToken.sol:LToken", + "label": "retentionRateUD7x3", + "offset": 24, + "slot": "763", + "type": "t_uint32" + }, + { + "astId": 5372, + "contract": "contracts/src/LToken.sol:LToken", + "label": "unclaimedFees", + "offset": 0, + "slot": "764", + "type": "t_uint256" + }, + { + "astId": 5375, + "contract": "contracts/src/LToken.sol:LToken", + "label": "totalQueued", + "offset": 0, + "slot": "765", + "type": "t_uint256" + }, + { + "astId": 5378, + "contract": "contracts/src/LToken.sol:LToken", + "label": "usableUnderlyings", + "offset": 0, + "slot": "766", + "type": "t_uint256" + }, + { + "astId": 5383, + "contract": "contracts/src/LToken.sol:LToken", + "label": "withdrawalQueue", + "offset": 0, + "slot": "767", + "type": "t_array(t_struct(WithdrawalRequest)5332_storage)dyn_storage" + }, + { + "astId": 5386, + "contract": "contracts/src/LToken.sol:LToken", + "label": "withdrawalQueueCursor", + "offset": 0, + "slot": "768", + "type": "t_uint256" + }, + { + "astId": 5391, + "contract": "contracts/src/LToken.sol:LToken", + "label": "frozenRequests", + "offset": 0, + "slot": "769", + "type": "t_array(t_struct(WithdrawalRequest)5332_storage)dyn_storage" + }, + { + "astId": 5396, + "contract": "contracts/src/LToken.sol:LToken", + "label": "transfersListeners", + "offset": 0, + "slot": "770", + "type": "t_array(t_contract(ITransfersListener)9399)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_address_payable": { + "encoding": "inplace", + "label": "address payable", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_contract(ITransfersListener)9399)dyn_storage": { + "base": "t_contract(ITransfersListener)9399", + "encoding": "dynamic_array", + "label": "contract ITransfersListener[]", + "numberOfBytes": "32" + }, + "t_array(t_struct(Pack)9418_storage)dyn_storage": { + "base": "t_struct(Pack)9418_storage", + "encoding": "dynamic_array", + "label": "struct APRHistory.Pack[]", + "numberOfBytes": "32" + }, + "t_array(t_struct(WithdrawalRequest)5332_storage)dyn_storage": { + "base": "t_struct(WithdrawalRequest)5332_storage", + "encoding": "dynamic_array", + "label": "struct LToken.WithdrawalRequest[]", + "numberOfBytes": "32" + }, + "t_array(t_uint16)4_storage": { + "base": "t_uint16", + "encoding": "inplace", + "label": "uint16[4]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)45_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint40)4_storage": { + "base": "t_uint40", + "encoding": "inplace", + "label": "uint40[4]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(GlobalBlacklist)4261": { + "encoding": "inplace", + "label": "contract GlobalBlacklist", + "numberOfBytes": "20" + }, + "t_contract(GlobalOwner)4308": { + "encoding": "inplace", + "label": "contract GlobalOwner", + "numberOfBytes": "20" + }, + "t_contract(GlobalPause)4384": { + "encoding": "inplace", + "label": "contract GlobalPause", + "numberOfBytes": "20" + }, + "t_contract(IERC20Upgradeable)1808": { + "encoding": "inplace", + "label": "contract IERC20Upgradeable", + "numberOfBytes": "20" + }, + "t_contract(ITransfersListener)9399": { + "encoding": "inplace", + "label": "contract ITransfersListener", + "numberOfBytes": "20" + }, + "t_contract(LDYStaking)5289": { + "encoding": "inplace", + "label": "contract LDYStaking", + "numberOfBytes": "20" + }, + "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_address)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address[])", + "numberOfBytes": "32", + "value": "t_array(t_address)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(AccountDetails)8219_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct InvestUpgradeable.AccountDetails)", + "numberOfBytes": "32", + "value": "t_struct(AccountDetails)8219_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(AccountDetails)8219_storage": { + "encoding": "inplace", + "label": "struct InvestUpgradeable.AccountDetails", + "members": [ + { + "astId": 8216, + "contract": "contracts/src/LToken.sol:LToken", + "label": "period", + "offset": 0, + "slot": "0", + "type": "t_struct(InvestmentPeriod)8213_storage" + }, + { + "astId": 8218, + "contract": "contracts/src/LToken.sol:LToken", + "label": "virtualBalance", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "numberOfBytes": "128" + }, + "t_struct(InvestmentPeriod)8213_storage": { + "encoding": "inplace", + "label": "struct InvestUpgradeable.InvestmentPeriod", + "members": [ + { + "astId": 8209, + "contract": "contracts/src/LToken.sol:LToken", + "label": "timestamp", + "offset": 0, + "slot": "0", + "type": "t_uint40" + }, + { + "astId": 8212, + "contract": "contracts/src/LToken.sol:LToken", + "label": "ref", + "offset": 0, + "slot": "1", + "type": "t_struct(Reference)9423_storage" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Pack)9418_storage": { + "encoding": "inplace", + "label": "struct APRHistory.Pack", + "members": [ + { + "astId": 9411, + "contract": "contracts/src/LToken.sol:LToken", + "label": "aprsUD7x3", + "offset": 0, + "slot": "0", + "type": "t_array(t_uint16)4_storage" + }, + { + "astId": 9415, + "contract": "contracts/src/LToken.sol:LToken", + "label": "timestamps", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint40)4_storage" + }, + { + "astId": 9417, + "contract": "contracts/src/LToken.sol:LToken", + "label": "cursor", + "offset": 0, + "slot": "2", + "type": "t_uint32" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Reference)9423_storage": { + "encoding": "inplace", + "label": "struct APRHistory.Reference", + "members": [ + { + "astId": 9420, + "contract": "contracts/src/LToken.sol:LToken", + "label": "packIndex", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 9422, + "contract": "contracts/src/LToken.sol:LToken", + "label": "cursorIndex", + "offset": 0, + "slot": "1", + "type": "t_uint32" + } + ], + "numberOfBytes": "64" + }, + "t_struct(WithdrawalRequest)5332_storage": { + "encoding": "inplace", + "label": "struct LToken.WithdrawalRequest", + "members": [ + { + "astId": 5329, + "contract": "contracts/src/LToken.sol:LToken", + "label": "account", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 5331, + "contract": "contracts/src/LToken.sol:LToken", + "label": "amount", + "offset": 20, + "slot": "0", + "type": "t_uint96" + } + ], + "numberOfBytes": "32" + }, + "t_uint16": { + "encoding": "inplace", + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "encoding": "inplace", + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + }, + "t_uint96": { + "encoding": "inplace", + "label": "uint96", + "numberOfBytes": "12" + } + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/LUSDC_Proxy.json b/contracts/hardhat/deployments/baseSepolia/LUSDC_Proxy.json new file mode 100644 index 00000000..a9a9c89e --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/LUSDC_Proxy.json @@ -0,0 +1,144 @@ +{ + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "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": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "receipt": { + "to": null, + "from": "0x69b69DC81CAf0b2FF53b946421F51b0eC276E679", + "contractAddress": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "transactionIndex": 6, + "gasUsed": "659225", + "logsBloom": "0x00000000000000000000000000000000400000000200000000000000000000000000000000000000000000000000100000000000000400000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000020000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000", + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add", + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 9269461, + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002c0f4c6127693c688ff4b8794fdb22ffb235cd87" + ], + "data": "0x", + "logIndex": 11, + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add" + }, + { + "transactionIndex": 6, + "blockNumber": 9269461, + "transactionHash": "0x54ac0032e007001b18ee1579167a51044857432a26d34c2bf632b77fd1448864", + "address": "0x3E995f24C0417b4A010B2DC403093F3e27B85d33", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 12, + "blockHash": "0x3ff923c38a15e82d9d99cae577d0829ca23223eb3fa5288af678b4b8fc3b9add" + } + ], + "blockNumber": 9269461, + "cumulativeGasUsed": "1515560", + "status": 1, + "byzantium": true + }, + "args": [ + "0x2c0F4C6127693C688ff4b8794fdB22FfB235cd87", + "0x1459457a00000000000000000000000001413e00b19dde5a37a4ef46eaba394535fdb1b20000000000000000000000009992cc9176f2b86c56fda697d814c1a054c2035e000000000000000000000000546b48297ce50fa31a383afe7df48297337c12b50000000000000000000000005f1e968d9103dddc896ff44b4aac9972a422b4c1000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e" + ], + "numDeployments": 1, + "solcInputHash": "0e89febeebc7444140de8e67c9067d2c", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary 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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/baseSepolia/solcInputs/0e89febeebc7444140de8e67c9067d2c.json b/contracts/hardhat/deployments/baseSepolia/solcInputs/0e89febeebc7444140de8e67c9067d2c.json new file mode 100644 index 00000000..6eb5ed90 --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/solcInputs/0e89febeebc7444140de8e67c9067d2c.json @@ -0,0 +1,80 @@ +{ + "language": "Solidity", + "sources": { + "solc_0.8/openzeppelin/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (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 (address initialOwner) {\n _transferOwnership(initialOwner);\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 called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing 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" + }, + "solc_0.8/openzeppelin/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" + }, + "solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./TransparentUpgradeableProxy.sol\";\nimport \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n\n constructor (address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Returns the current implementation of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"implementation()\")) == 0x5c60da1b\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"5c60da1b\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Returns the current admin of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"admin()\")) == 0xf851a440\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"f851a440\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Changes the admin of `proxy` to `newAdmin`.\n *\n * Requirements:\n *\n * - This contract must be the current admin of `proxy`.\n */\n function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {\n proxy.changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {\n proxy.upgradeTo(implementation);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See\n * {TransparentUpgradeableProxy-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgradeAndCall(\n TransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overriden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view virtual returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(Address.isContract(IBeacon(newBeacon).implementation()), \"ERC1967: beacon implementation is not a contract\");\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "solc_0.8/openzeppelin/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(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 require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(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 require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason 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 // 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\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}\n" + }, + "solc_0.8/openzeppelin/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary 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 /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\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 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 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 assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\n address internal immutable _ADMIN;\n\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _ADMIN = admin_;\n\n // still store it to work with EIP-1967\n bytes32 slot = _ADMIN_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, admin_)\n }\n emit AdminChanged(address(0), admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n\n function _getAdmin() internal view virtual override returns (address) {\n return _ADMIN;\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/utils/UUPSUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate that the this implementation remains valid after an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeTo(address newImplementation) external virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n}\n" + }, + "solc_0.8/openzeppelin/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/Address.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 * 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 initialize the implementation contract, you can either invoke the\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() initializer {}\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool 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 Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\n // contract may have been reentered.\n require(_initializing ? _isConstructor() : !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} modifier, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n function _isConstructor() private view returns (bool) {\n return !Address.isContract(address(this));\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/beacon/UpgradeableBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IBeacon.sol\";\nimport \"../../access/Ownable.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\n * implementation contract, which is where they will delegate all function calls.\n *\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\n */\ncontract UpgradeableBeacon is IBeacon, Ownable {\n address private _implementation;\n\n /**\n * @dev Emitted when the implementation returned by the beacon is changed.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\n * beacon.\n */\n\n constructor(address implementation_, address initialOwner) Ownable(initialOwner) {\n _setImplementation(implementation_);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function implementation() public view virtual override returns (address) {\n return _implementation;\n }\n\n /**\n * @dev Upgrades the beacon to a new implementation.\n *\n * Emits an {Upgraded} event.\n *\n * Requirements:\n *\n * - msg.sender must be the owner of the contract.\n * - `newImplementation` must be a contract.\n */\n function upgradeTo(address newImplementation) public virtual onlyOwner {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Sets the implementation contract address for this beacon\n *\n * Requirements:\n *\n * - `newImplementation` must be a contract.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"UpgradeableBeacon: implementation is not a contract\");\n _implementation = newImplementation;\n }\n}\n" + }, + "solc_0.8/openzeppelin/proxy/beacon/BeaconProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/BeaconProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IBeacon.sol\";\nimport \"../Proxy.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}.\n *\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\n * conflict with the storage layout of the implementation behind the proxy.\n *\n * _Available since v3.4._\n */\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the proxy with `beacon`.\n *\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This\n * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity\n * constructor.\n *\n * Requirements:\n *\n * - `beacon` must be a contract with the interface {IBeacon}.\n */\n constructor(address beacon, bytes memory data) payable {\n assert(_BEACON_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.beacon\")) - 1));\n _upgradeBeaconToAndCall(beacon, data, false);\n }\n\n /**\n * @dev Returns the current beacon address.\n */\n function _beacon() internal view virtual returns (address) {\n return _getBeacon();\n }\n\n /**\n * @dev Returns the current implementation address of the associated beacon.\n */\n function _implementation() internal view virtual override returns (address) {\n return IBeacon(_getBeacon()).implementation();\n }\n\n /**\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\n *\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\n *\n * Requirements:\n *\n * - `beacon` must be a contract.\n * - The implementation returned by `beacon` must be a contract.\n */\n function _setBeacon(address beacon, bytes memory data) internal virtual {\n _upgradeBeaconToAndCall(beacon, data, false);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 999999 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/localhost/solcInputs/1c94255f5edec71501da736e9b19ae5f.json b/contracts/hardhat/deployments/baseSepolia/solcInputs/15c81200c85905d33a34abc672a45266.json similarity index 76% rename from contracts/hardhat/deployments/localhost/solcInputs/1c94255f5edec71501da736e9b19ae5f.json rename to contracts/hardhat/deployments/baseSepolia/solcInputs/15c81200c85905d33a34abc672a45266.json index 63091b47..56db149d 100644 --- a/contracts/hardhat/deployments/localhost/solcInputs/1c94255f5edec71501da736e9b19ae5f.json +++ b/contracts/hardhat/deployments/baseSepolia/solcInputs/15c81200c85905d33a34abc672a45266.json @@ -28,6 +28,9 @@ "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\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" }, + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\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" + }, "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\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 /**\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[45] private __gap;\n}\n" }, @@ -112,14 +115,11 @@ "contracts/src/abstracts/RecoverableUpgradeable.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Conracts\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./GlobalOwnableUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title RecoverableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts are provided with helper functions allowing the recovery of\n * assets accidentally sent to them.\n *\n * @dev Where are utilities Ether, ERC721, etc.?\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\n * in this codebase currently do not implement the necessary functions to receive Ether\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\n *\n * @dev For further details, see \"RecoverableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\n __GlobalOwnable_init(globalOwner_);\n __Recoverable_init_unchained();\n }\n\n function __Recoverable_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Recovers a specified amount of a given token address. Will fail if the\n * contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\n // Ensure the specified amount is not zero\n require(amount > 0, \"L10\");\n\n // Create a reference to token's contract\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\n\n // Ensure there is enough token to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L11\");\n\n // Transfer the recovered token amount to the sender\n tokenContract.safeTransfer(_msgSender(), amount);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" }, - "contracts/src/DummyLDYStaking.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\n/**\n * @title LDYStaking\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\n * this one is deployed.\n *\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\n * one the LToken contract relies on.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDYStaking is Ownable2Step {\n /**\n * @notice Holds a mapping of addresses that default to the highest staking tier.\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\n */\n mapping(address => bool) public highTierAccounts;\n\n /**\n * @notice Update high tier status of a given account.\n * @param account The account to update the high tier status of.\n */\n function setHighTierAccount(address account, bool status) public onlyOwner {\n highTierAccounts[account] = status;\n }\n\n /**\n * @dev Dummy tierOf() function that always return that the given account is not\n * elligible to any LDY staking tier, except if the account is in the\n * highTierAccounts mapping.\n * @param account The account to check the tier of.\n */\n function tierOf(address account) public view returns (uint256 tier) {\n if (highTierAccounts[account]) return 3;\n return 0;\n }\n}\n" - }, "contracts/src/GenericERC20.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {ERC20Burnable} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @notice Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls.\n * It represents:\n * - a FIAT-based stablecoin when used to test the LToken contract,\n * - the $LDY token when used to test the LDYStaking contract.\n * This contract accept decimals as constructor argument, so it can be used to to\n * easily test different decimals scenarios.\n */\ncontract GenericERC20 is ERC20, ERC20Burnable {\n uint8 private _decimals;\n\n constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) {\n _decimals = decimals_;\n }\n\n function mint(uint256 amount) public {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n /**\n * Used in tests to test different decimals scenarios.\n */\n function setDecimals(uint8 decimals_) public {\n _decimals = decimals_;\n }\n}\n" }, "contracts/src/GlobalBlacklist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalBlacklist\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\n * Ledgity Yield codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\n * and getter functions to easily check against this global blacklist.\n *\n * @dev For further details, see \"GlobalBlacklist\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Mapping of accounts to their blacklist status.\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\n */\n mapping(address => bool) private _list;\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Adds a given account to the blacklist.\n * @param account The account's address to be blacklisted.\n */\n function blacklist(address account) external onlyOwner {\n require(account != address(0), \"L20\");\n _list[account] = true;\n }\n\n /**\n * @notice Removes a given account from the blacklist.\n * @param account The account's address to be un-blacklisted.\n */\n function unBlacklist(address account) external onlyOwner {\n _list[account] = false;\n }\n\n /**\n * @notice Checks whether a given account is blacklisted.\n * @param account Address of the account to check.\n * @return 'true' if the account is blacklisted, 'false' otherwise\n */\n function isBlacklisted(address account) external view returns (bool) {\n // Gas optimization: Avoid accessing storage if account is the zero address\n // (e.g, during a mint or a burn of tokens)\n if (account == address(0)) return false;\n\n // Else, return current account's blacklist status\n return _list[account];\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalBlacklist\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\n * Ledgity Yield codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\n * and getter functions to easily check against this global blacklist.\n *\n * @dev For further details, see \"GlobalBlacklist\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Mapping of accounts to their blacklist status.\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\n */\n mapping(address => bool) private _list;\n\n /// @dev Emitted when `account` is blacklisted.\n event Blacklisted(address account);\n\n /// @dev Emitted when `account` is unblacklisted.\n event Unblacklisted(address account);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Adds a given account to the blacklist.\n * @param account The account's address to be blacklisted.\n */\n function blacklist(address account) external onlyOwner {\n require(account != address(0), \"L20\");\n _list[account] = true;\n emit Blacklisted(account);\n }\n\n /**\n * @notice Removes a given account from the blacklist.\n * @param account The account's address to be un-blacklisted.\n */\n function unBlacklist(address account) external onlyOwner {\n _list[account] = false;\n emit Unblacklisted(account);\n }\n\n /**\n * @notice Checks whether a given account is blacklisted.\n * @param account Address of the account to check.\n * @return 'true' if the account is blacklisted, 'false' otherwise\n */\n function isBlacklisted(address account) external view returns (bool) {\n // Gas optimization: Avoid accessing storage if account is the zero address\n // (e.g, during a mint or a burn of tokens)\n if (account == address(0)) return false;\n\n // Else, return current account's blacklist status\n return _list[account];\n }\n}\n" }, "contracts/src/GlobalOwner.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {Ownable2StepUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\n/**\n * @title GlobalOwner\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds the address of a global owner account shared by all contracts of the\n * Ledgity Yield's codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\n * owner() function that retrieves the owner's address from this contract instead.\n *\n * @dev For further details, see \"GlobalOwner\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize() public initializer {\n __Ownable2Step_init();\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n}\n" @@ -130,6 +130,12 @@ "contracts/src/interfaces/ITransfersListener.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\ninterface ITransfersListener {\n function onLTokenTransfer(address from, address to, uint256 amount) external;\n}\n" }, + "contracts/src/LDY.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {ERC20Burnable} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @title LDY\n * @author Lila Rest (lila@ledgity.com)\n * @dev The $LDY is the utility and governance token of the entire Ledgity ecosystem.\n *\n * This contract has been kept as minimal as possible to enforce stakeholders safety\n * but also to pave the way for sensitive use cases like cross-chain bridging, use in\n * governance scenarios, and compatibility with 3rd party DApps.\n *\n * It is non-upgradeable, non-ownable, non-pausable, non-mintable, and non-restrictable.\n * It implements nothing more than what is provided by its OpenZepellin ancestors.\n *\n * Moreover, to eliminate the need for ownership and complex vesting functions, the\n * entire supply is minted at deployment-time. Vesting of allocated tokens is then\n * managed via Sablier streams that anyone can verify on this page:\n * https://docs.ledgity.finance/tokenomics/vesting-proofs\n *\n * Specifications:\n * - Name: Ledgity Token\n * - Symbol: LDY\n * - Decimals: 18\n * - Total supply: 75,000,000\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDY is ERC20, ERC20Burnable {\n constructor() ERC20(\"Ledgity Token\", \"LDY\") {\n _mint(msg.sender, 75_000_000 * 10 ** decimals());\n }\n}\n" + }, + "contracts/src/LDYStaking.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ReentrancyGuardUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport {BaseUpgradeable} from \"./abstracts/base/BaseUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title LDYStaking\n * @custom:security-contact security@ledgity.com\n *\n * @dev This contract implements tierOf() function from LDYStaking as it's the only\n * one the LToken contract relies on.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDYStaking is BaseUpgradeable, ReentrancyGuardUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /**\n * @notice Represents a user staking info in array.\n * @param stakedAmount Amount of the stake.\n * @param unStakeAt Unstake at.\n * @param duration Staking period in seconds.\n * @param rewardPerTokenPaid Reward per token paid.\n * @param rewards Rewards to be claimed.\n */\n struct StakingInfo {\n uint256 stakedAmount;\n uint256 unStakeAt;\n uint256 duration;\n uint256 rewardPerTokenPaid;\n uint256 rewards;\n }\n\n /// @notice Stake and Reward token.\n IERC20Upgradeable public stakeRewardToken;\n\n /// @notice Minimal stake duration for perks.\n uint256 public stakeDurationForPerks;\n\n /// @notice Minimal stake amount for perks.\n uint256 public stakeAmountForPerks;\n\n /// @notice Stake durations.\n uint256[] public stakeDurations;\n\n /// @notice Duration of the rewards (in seconds).\n uint256 public rewardsDuration;\n\n /// @notice Timestamp of when the rewards finish.\n uint256 public finishAt;\n\n /// @notice Timestamp of the reward updated.\n uint256 public lastUpdateTime;\n\n /// @notice Reward per second(total rewards / duration).\n uint256 public rewardRatePerSec;\n\n /// @notice Reward per token stored, sum of (reward rate * dt * 1e18 / total supply).\n uint256 public rewardPerTokenStored;\n\n /// @notice Total staked amounts.\n uint256 public totalStaked;\n\n /// @notice User stakingInfo map, user address => array of the staking info\n mapping(address => StakingInfo[]) public userStakingInfo;\n\n /**\n * @notice Emitted when users stake token\n * @param user User address\n * @param stakeIndex Latest index of user staking pool\n * @param amount Staked amount\n */\n event Staked(address indexed user, uint256 stakeIndex, uint256 amount);\n\n /**\n * @notice Emitted when users unstake token\n * @param user User address\n * @param stakeIndex User staking pool index\n * @param amount Staked amount\n */\n event Unstaked(address indexed user, uint256 stakeIndex, uint256 amount);\n\n /**\n * @notice Emitted when users claim rewards\n * @param user User address\n * @param stakeIndex User staking pool index\n * @param reward Reward token amount\n */\n event RewardPaid(address indexed user, uint256 stakeIndex, uint256 reward);\n\n /**\n * @notice Emitted when admin add rewards.\n * @param rewardAmount Reward amount added by admin.\n * @param rewardPerSec RewardRatePerSec updated.\n */\n event NotifiedRewardAmount(uint256 rewardAmount, uint256 rewardPerSec);\n\n /**\n * @notice Holds a mapping of addresses that default to the highest staking tier.\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\n */\n mapping(address => bool) public highTierAccounts;\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once.\n * @dev This function is intended for setting initial values for the contract's state variables.\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param stakeRewardToken_ The address of stake and reward token(LDY token).\n * @param stakeDurations_ Available Staking Durations.\n * @param stakeDurationForPerks_ Minimal staking duration for perks.\n * @param stakeAmountForPerks_ Minimal staking amount for perks.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address stakeRewardToken_,\n uint256[] memory stakeDurations_,\n uint256 stakeDurationForPerks_,\n uint256 stakeAmountForPerks_\n ) public initializer {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n stakeRewardToken = IERC20Upgradeable(stakeRewardToken_);\n stakeDurations = stakeDurations_;\n stakeDurationForPerks = stakeDurationForPerks_;\n stakeAmountForPerks = stakeAmountForPerks_;\n }\n\n // --------------------\n // MUTATIVE FUNCTIONS\n // --------------------\n\n /**\n * @notice Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards.\n * @dev Emits a `Staked` event upon successful staking.\n * @param amount The amount of tokens to stake.\n * @param stakeDurationIndex The Index of stakeDurations array.\n */\n function stake(\n uint256 amount,\n uint8 stakeDurationIndex\n ) external nonReentrant whenNotPaused notBlacklisted(_msgSender()) {\n require(amount > 0, \"amount = 0\");\n require(stakeDurationIndex <= stakeDurations.length - 1, \"invalid staking period\");\n\n _updateReward(address(0), 0);\n uint256 stakeDuration = stakeDurations[stakeDurationIndex];\n StakingInfo memory stakingInfo = StakingInfo({\n stakedAmount: amount,\n unStakeAt: block.timestamp + stakeDuration,\n duration: stakeDuration,\n rewardPerTokenPaid: rewardPerTokenStored,\n rewards: 0\n });\n\n // check whether account is eligible for benefit from the protocol\n if (stakeDuration >= stakeDurationForPerks && amount >= stakeAmountForPerks) {\n highTierAccounts[_msgSender()] = true;\n }\n\n userStakingInfo[_msgSender()].push(stakingInfo);\n\n uint256 stakeIndex = userStakingInfo[_msgSender()].length - 1;\n totalStaked += amount;\n\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\n\n emit Staked(_msgSender(), stakeIndex, amount);\n }\n\n /**\n * @notice Withdraw staked tokens after stakeDuration has passed.\n * @dev Emits a `Unstaked` event upon successful withdrawal.\n * On full withdrawal, userStakingInfo removes stake pool for stakeIndex.\n * @param amount The amount of tokens to withdraw.\n * @param stakeIndex The index of user staking pool\n */\n function unstake(\n uint256 amount,\n uint256 stakeIndex\n ) external nonReentrant notBlacklisted(_msgSender()) {\n require(amount > 0, \"amount = 0\");\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \"invalid stakeIndex\");\n require(\n block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt,\n \"not allowed unstaking in the staking period\"\n );\n require(\n amount <= userStakingInfo[_msgSender()][stakeIndex].stakedAmount,\n \"insufficient amount\"\n );\n\n _updateReward(_msgSender(), stakeIndex);\n totalStaked -= amount;\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount -= amount;\n\n // check whether account is eligible for benefit from the protocol\n if (\n userStakingInfo[_msgSender()][stakeIndex].duration >= stakeDurationForPerks &&\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount < stakeAmountForPerks\n ) {\n highTierAccounts[_msgSender()] = false;\n }\n\n // remove staking info from array on full withdrawal\n if (userStakingInfo[_msgSender()][stakeIndex].stakedAmount == 0) {\n _claimReward(_msgSender(), stakeIndex);\n\n userStakingInfo[_msgSender()][stakeIndex] = userStakingInfo[_msgSender()][\n userStakingInfo[_msgSender()].length - 1\n ];\n userStakingInfo[_msgSender()].pop();\n }\n stakeRewardToken.safeTransfer(_msgSender(), amount);\n\n emit Unstaked(_msgSender(), stakeIndex, amount);\n }\n\n /**\n * @notice Claim pending rewards.\n * @dev Emits a `RewardPaid` event upon successful reward claim.\n * @param stakeIndex The index of user staking pool.\n */\n function getReward(uint256 stakeIndex) external nonReentrant notBlacklisted(_msgSender()) {\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \"invalid stakeIndex\");\n _updateReward(_msgSender(), stakeIndex);\n _claimReward(_msgSender(), stakeIndex);\n }\n\n // --------------------\n // ADMIN CONFIGURATION\n // --------------------\n\n /**\n * @notice Update Rewards Duration.\n * @dev Only callable by owner, and setting available only after rewards period.\n * @param duration The nmew rewards duration in seconds.\n */\n function setRewardsDuration(uint256 duration) external onlyOwner {\n require(finishAt < block.timestamp, \"reward duration is not finished\");\n rewardsDuration = duration;\n }\n\n /**\n * @notice Notify the contract about the amount of rewards to be distributed and update reward parameters.\n * @dev Only callable by owner.\n * @param amount The amount of reward to be distributed.\n */\n function notifyRewardAmount(uint256 amount) external onlyOwner {\n require(rewardsDuration > 0, \"rewards duration is not set\");\n require(amount > 0, \"amount = 0\");\n\n _updateReward(address(0), 0);\n\n if (block.timestamp >= finishAt) {\n rewardRatePerSec = amount / rewardsDuration;\n } else {\n uint256 remainingRewards = (finishAt - block.timestamp) * rewardRatePerSec;\n rewardRatePerSec = (amount + remainingRewards) / rewardsDuration;\n }\n\n require(rewardRatePerSec > 0, \"reward rate = 0\");\n require(\n rewardRatePerSec <=\n (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) /\n rewardsDuration,\n \"reward amount > balance\"\n );\n\n finishAt = block.timestamp + rewardsDuration;\n lastUpdateTime = block.timestamp;\n\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\n\n emit NotifiedRewardAmount(amount, rewardRatePerSec);\n }\n\n // --------------------\n // VIEW FUNCTIONS\n // --------------------\n\n /**\n * @notice Get the last time when rewards were applicable for the specified reward token.\n * @return Timestamp of the most recent rewards calculation.\n */\n function lastTimeRewardApplicable() public view returns (uint256) {\n return _min(finishAt, block.timestamp);\n }\n\n /**\n * @notice Calculate the reward per token for a given reward token.\n * @return Current reward per token.\n */\n function rewardPerToken() public view returns (uint256) {\n if (totalStaked == 0) {\n return rewardPerTokenStored;\n }\n\n return\n rewardPerTokenStored +\n (rewardRatePerSec * (lastTimeRewardApplicable() - lastUpdateTime) * 1e18) /\n totalStaked;\n }\n\n /**\n * @notice Calculate the total earned rewards for a user.\n * @param account Address of the user.\n * @param stakeIndex User's locked token balance.\n * @return Total earned rewards for the user.\n */\n function earned(address account, uint256 stakeIndex) public view returns (uint256) {\n StakingInfo memory userInfo = userStakingInfo[account][stakeIndex];\n uint256 rewardsSinceLastUpdate = ((userInfo.stakedAmount *\n (rewardPerToken() - userInfo.rewardPerTokenPaid)) / 1e18);\n return rewardsSinceLastUpdate + userInfo.rewards;\n }\n\n /**\n * @dev tierOf() function that always return that the given account is not\n * elligible to any LDY staking tier, except if the account is in the\n * highTierAccounts mapping.\n * @param account The account to check the tier of.\n */\n function tierOf(address account) public view returns (uint256 tier) {\n if (highTierAccounts[account]) return 3;\n return 0;\n }\n\n /**\n * @notice Get User Stake Data.\n * @param account The address of user.\n * @return StakingInfo array.\n */\n function getUserStakes(address account) external view returns (StakingInfo[] memory) {\n return userStakingInfo[account];\n }\n\n /**\n * @notice Send rewards to user.\n * @dev This is private function, called by getReward function.\n * @param account The address of user.\n * @param stakeIndex The index of user staking pool.\n */\n function _claimReward(address account, uint256 stakeIndex) private {\n uint256 reward = userStakingInfo[account][stakeIndex].rewards;\n\n if (reward > 0) {\n userStakingInfo[account][stakeIndex].rewards = 0;\n stakeRewardToken.safeTransfer(account, reward);\n emit RewardPaid(account, stakeIndex, reward);\n }\n }\n\n /**\n * @notice Calculate and update user rewards per stakeIndex.\n * @dev this is private function, called by stake, unstake, getRewards, and notifyRewardAmount functions.\n * @param account The address of user.\n * @param stakeIndex The index of user staking pool.\n */\n function _updateReward(address account, uint256 stakeIndex) private {\n rewardPerTokenStored = rewardPerToken();\n lastUpdateTime = lastTimeRewardApplicable();\n\n if (account != address(0)) {\n userStakingInfo[account][stakeIndex].rewards = earned(account, stakeIndex);\n userStakingInfo[account][stakeIndex].rewardPerTokenPaid = rewardPerTokenStored;\n }\n }\n\n /**\n * @notice Take minimum value between x and y.\n */\n function _min(uint256 x, uint256 y) private pure returns (uint256) {\n return x <= y ? x : y;\n }\n}\n" + }, "contracts/src/libs/APRHistory.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n/**\n * @title APRHistory\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This library offers utilities to efficiently maintain the history of an\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\n * a \"checkpoint\".\n *\n * @dev Intuition:\n * Each checkpoint in an APR history consists of two data:\n * - the creation timestamp\n * - the APR at that time\n *\n * Given that reading and writing to storage slots are among the most costly operations\n * in Solidity, this library provides a way to store those data in a way that minimizes\n * the number of used storage slots.\n *\n * Instead of storing each checkpoint in a separate storage slot, this library\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\n *\n * @dev Definitions:\n * - Checkpoint: A record of an APR change\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\n * - History: A dynamic array of packs\n * - Reference: A storage pointer to a checkpoint in the APR history\n * - CheckpointData: An in-memory representation of a checkpoint data\n *\n * @dev Value limitation:\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\n * APR in LToken contract, which is expected to remain below 10%.\n *\n * @dev For further details, see \"APRHistory\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary APRHistory {\n /**\n * @notice Represents data of a checkpoint extracted from the on-chain history.\n * For on-chain representation see \"Pack\" struct.\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\n * @param timestamp Timestamp of the checkpoint's creation.\n */\n struct CheckpointData {\n uint16 aprUD7x3; // Allows up to 65.536%\n uint40 timestamp; // Supports dates up to 20/02/36812\n }\n\n /**\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\n * @param aprsUD7x3 Array of checkpoints' APRs.\n * @param timestamps Array of checkpoints' timestamps.\n * @param cursor Index of the next checkpoint to be written.\n */\n struct Pack {\n uint16[4] aprsUD7x3;\n uint40[4] timestamps;\n uint32 cursor;\n }\n\n /**\n * @notice Represents a storage pointer to a specific checkpoint in the history.\n * @param packIndex Index of the pack the checkpoint belongs to.\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\n */\n struct Reference {\n uint256 packIndex;\n uint32 cursorIndex;\n }\n\n /**\n * @notice Compares two checkpoints references.\n * @param ref1 The first reference to compare.\n * @param ref2 The second reference to compare.\n * @return Whether the two references points to the same checkpoint.\n */\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\n }\n\n /**\n * @notice Returns the reference of the checkpoint that should come right after the\n * referenced checkpoint in the APR history.\n * @param ref The reference to be incremented.\n * @return The incremented reference.\n */\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L1\");\n\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\n //\n // Else, return ref of next slot in current pack\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\n }\n\n /**\n * @notice Extracts checkpoint data from a given reference and in APR history.\n * @param self The APR history to extract the checkpoint from.\n * @param ref The reference of the checkpoint data to extract.\n * @return The extracted checkpoint's data.\n */\n function getDataFromReference(\n Pack[] storage self,\n Reference memory ref\n ) public view returns (CheckpointData memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L2\");\n\n // Ensure pack index of the given ref exists in history\n require(ref.packIndex < self.length, \"L3\");\n\n // Retrieve pack data from history\n Pack memory pack = self[ref.packIndex];\n\n // Ensure cursor index of the given ref has been written\n require(ref.cursorIndex < pack.cursor, \"L4\");\n\n // Build and return the checkpoint data\n return\n CheckpointData({\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\n timestamp: pack.timestamps[ref.cursorIndex]\n });\n }\n\n /**\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\n * @param self The history to extract the reference from.\n * @return The reference of the latest checkpoint.\n */\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\n // Ensure the given history is not empty\n require(self.length != 0, \"L5\");\n\n // Retrieve latest pack's index and cursor\n uint256 packIndex = self.length - 1;\n uint32 packCursor = self[packIndex].cursor;\n\n // If this is the first pack ever, ensure it is not empty\n if (packIndex == 0) require(packCursor != 0, \"L6\");\n\n // If the pack is empty, return ref of previous pack's latest slot\n if (packCursor == 0) return Reference(packIndex - 1, 3);\n //\n // Else, return ref of previous slot in current pack\n else return Reference(packIndex, packCursor - 1);\n }\n\n /**\n * @notice Appends a new empty pack to the end of the given APR history array.\n * @param self The APR history to append an empty to.\n */\n function newBlankPack(Pack[] storage self) internal {\n // If history is not empty, ensure the latest pack is full\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \"L7\");\n\n // Push a new blank pack to the history array\n self.push(\n Pack({\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\n cursor: 0\n })\n );\n }\n\n /**\n * @notice Write a new APR checkpoint at the end of the given history array.\n * @param self The array of packs to write the new checkpoint to.\n * @param aprUD7x3 The new APR in UD7x3 format.\n */\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\n // Determine the reference where the new checkpoint should be written\n Reference memory newRef = self.length == 0\n ? Reference(0, 0)\n : incrementReference(getLatestReference(self));\n\n // If pack to be written doesn't exist yet, push a new blank pack in history\n if (newRef.packIndex >= self.length) newBlankPack(self);\n\n // Retrieve the pack where the new checkpoint will be stored\n Pack memory pack = self[newRef.packIndex];\n\n // Add new checkpoint's data to the pack\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\n\n // Increment the pack's cursor\n pack.cursor++;\n\n // Write the updated pack in storage\n self[newRef.packIndex] = pack;\n }\n\n /**\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\n * @param self The history array to read APR from.\n * @return The latest checkpoint's APR.\n */\n function getAPR(Pack[] storage self) public view returns (uint16) {\n // Retrieve the latest checkpoint data\n Reference memory ref = getLatestReference(self);\n CheckpointData memory data = getDataFromReference(self, ref);\n\n // Return the latest checkpoint's APR\n return data.aprUD7x3;\n }\n}\n" }, @@ -137,7 +143,7 @@ "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\n\n/**\n * @title SUD\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice SUD serves as an intermediary number format for calculations within this\n * codebase. It ensures consistency and reduces precision losses. This library\n * facilitates conversions between various number formats and the SUD format.\n *\n * @dev Intuition:\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\n * represent both percentage rates and tokens amounts.\n *\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\n * the decimals() value of the involved tokens.\n *\n * Three challenges arise from this:\n * 1) To compute values together, it's essential that they are in the same format\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\n * precision loss (because division shrinks). A common approach is to scale up and\n * down values by a few decimals before and after performing calculations.\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\n * be shrunk in case token's decimals number is in [0, 2].\n *\n * To address these challenges, this library provides the SUD format, which acts as a\n * consistent and scaled intermediate format to perform calculations.\n *\n * SUD is an acronym for either \"Scaled UD\" or \"Safe UD\".\n *\n * @dev Definitions:\n * - Integer: A number without fractional part, e.g., block.timestamp\n * - UD: A decimal unsigned fixed-point number. The \"UD\" notation is inspired from\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\n * and fractional parts (as token amounts have variable decimal numbers)\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\n * with 3 more decimals than the involved UD with the highest decimals number. As\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\n * so ranges from UD71x6 to UD0x77 formats.\n *\n * @dev A conversion library:\n * This library provides utilities to perform the following conversions:\n * - Amount <--> SUD\n * - Rate (UD7x3) <--> SUD\n * - Integer <--> SUD\n *\n * @dev Why scaling by 3 decimals?\n * - It provides an adequate degree of precision for this codebase,\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\n * the involved token's decimal number, so is gas efficient.\n *\n * @dev Why internal functions?\n * The functions of this library are not set to external because incorporating them\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\n * from making them external are negated by the additional bytecode required for external\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\n * when those functions's visibility is set to external or internal.\n *\n * @dev Precision warning:\n * While this library mitigates precision loss during calculations on UD numbers, it's\n * important to note that tokens with lower decimal counts and supply inherently suffer\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\n * will experience less precision loss.\n *\n * @dev For further details, see \"SUD\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary SUD {\n /**\n * @notice Retrieves decimals number of the given ERC20 contract address.\n * @param tokenAddress The address to retrieve decimals number from.\n * @return decimals The decimals number of the given ERC20 contract address.\n */\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\n }\n\n /**\n * @notice Convert a given token amount into SUD format.\n * @param nAmount The token amount to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The amount in SUD format\n */\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\n\n // Else return a number with decimals+3 fractional digits\n return nAmount * 10 ** 3;\n }\n\n /**\n * @notice Convert a given SUD number into token amount format.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nAmount The number in amount format\n */\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** 3;\n }\n\n /**\n * @notice Converts a given UD7x3 rate into SUD format.\n * @param nUD7x3 The UD7x3 rate to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The rate in SUD format.\n */\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nUD7x3 * 10 ** 3;\n\n // Else, return a number with decimals+3 fractional digits\n return nUD7x3 * 10 ** decimals;\n }\n\n /**\n * @notice Converts a given SUD number into a UD7x3 rate.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nUD7x3 The number in UD7x3 rate format.\n */\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 3;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** decimals;\n }\n\n /**\n * @notice Converts a given integer into SUD format.\n * @param n The integer to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The integer in SUD format.\n */\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return n * 10 ** 6;\n\n // Else, return a number with decimals+3 fractional digits\n return n * 10 ** (decimals + 3);\n }\n\n /**\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return n The SUD number as an integer.\n */\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 6;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** (decimals + 3);\n }\n}\n" }, "contracts/src/LToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ERC20WrapperUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\";\nimport \"./abstracts/base/ERC20BaseUpgradeable.sol\";\nimport {InvestUpgradeable} from \"./abstracts/InvestUpgradeable.sol\";\nimport {LDYStaking} from \"./DummyLDYStaking.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {SUD} from \"./libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\nimport {ITransfersListener} from \"./interfaces/ITransfersListener.sol\";\n\n/**\n * @title LToken\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\n * the form of additional L-Tokens, which are auto-compounded over time.\n *\n * @dev Definitions:\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\n * - Instant: Processed immediately.\n * - Request: Queued for later processing.\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\n * - Request ID: The index of a withdrawal request in the queue array.\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\n * expected ways and are so considered safe to use by the contract.\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\n * processing.\n *\n * Note that words between parenthesis are sometimes omitted for brevity.\n *\n * @dev Deployment notice:\n * This contract can safely receive funds immediately after initialization. (i.e., there\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\n * replace ASAP owner and fund wallets with multi-sig wallets.\n *\n * @dev For further details, see \"LToken\" section of whitepaper.\n * @custom:oz-upgrades-unsafe-allow external-library-linking\n * @custom:security-contact security@ledgity.com\n */\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /// @dev Represents type of actions triggering ActivityEvent events.\n enum Action {\n Deposit,\n Withdraw\n }\n\n /// @dev Represents different status of actions triggering ActivityEvent events.\n enum Status {\n Queued,\n Cancelled,\n Success,\n Moved\n }\n\n /**\n * @notice Represents a withdrawal request in the queue.\n * @dev A request fits in a single storage slot (32 bytes).\n * @param account The account that initiated the request.\n * @param amount The amount of underlying tokens requested.\n */\n struct WithdrawalRequest {\n address account; // 20 bytes\n uint96 amount; // 12 bytes\n }\n\n /// @notice Upper limit of retention rate.\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\n\n /// @notice Upper limit of fees rate.\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\n\n /// @notice Used in activity events to represent the absence of request ID.\n int256 private constant NO_ID = -1;\n\n /// @notice Holds a reference to the LDYStaking contract.\n LDYStaking public ldyStaking;\n\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\n address payable public withdrawer;\n\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\n address public fund;\n\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\n uint32 public feesRateUD7x3;\n\n /// @notice Holds the retention rate in UD7x3 format.\n uint32 public retentionRateUD7x3;\n\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\n uint256 public unclaimedFees;\n\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\n uint256 public totalQueued;\n\n /**\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\n */\n uint256 public usableUnderlyings;\n\n /// @notice Holds an ordered list of active withdrawal requests.\n WithdrawalRequest[] public withdrawalQueue;\n\n /// @notice Holds the index of the next withdrawal request to process in the queue.\n uint256 public withdrawalQueueCursor;\n\n /**\n * @notice Holds a list of all currently frozen withdrawal requests.\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\n * it from blocking the queue.\n */\n WithdrawalRequest[] public frozenRequests;\n\n /**\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\n */\n ITransfersListener[] public transfersListeners;\n\n /**\n * @notice Emitted to inform listeners about a change in the contract's TVL.\n * @dev TVL = realTotalSupply()\n * @param newTVL The new TVL of the contract.\n */\n event TVLChangeEvent(uint256 newTVL);\n\n /**\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\n * @param account The account involved in the activity.\n * @param action The type of activity.\n * @param amount The amount of underlying tokens involved in the activity.\n * @param newStatus The new status of the activity.\n * @param newId The new ID of the request if it has been moved in the queue.\n */\n event ActivityEvent(\n int256 indexed id,\n address indexed account,\n Action indexed action,\n uint256 amount,\n uint256 amountAfterFees,\n Status newStatus,\n int256 newId\n );\n\n /**\n * @notice Emitted to inform listeners that some rewards have been minted.\n * @param account The account that received the rewards.\n * @param balanceBefore The balance of the account before the minting.\n * @param rewards The amount of minted rewards.\n */\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\n\n /// @notice Reverts if the function caller is not the withdrawer wallet.\n modifier onlyWithdrawer() {\n require(_msgSender() == withdrawer, \"L39\");\n _;\n }\n\n /// @notice Reverts if the function caller is not the fund wallet.\n modifier onlyFund() {\n require(_msgSender() == fund, \"L40\");\n _;\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address ldyStaking_,\n address underlyingToken\n ) public initializer {\n // Initialize ERC20 base.\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\n __ERC20Base_init(\n globalOwner_,\n globalPause_,\n globalBlacklist_,\n string(abi.encodePacked(\"Ledgity \", underlyingSymbol)),\n string(abi.encodePacked(\"L\", underlyingSymbol))\n );\n\n // IMPORTANT: Below calls must not be restricted to owner at any point.\n // This is because the GlobalOwner contract may not be a fresh one, and so\n // the contract deployer may not be the owner anymore after ERC20Base init.\n\n // Initialize other parents contracts.\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\n __Invest_init_unchained(address(this));\n\n // Set LDYStaking contract\n ldyStaking = LDYStaking(ldyStaking_);\n\n // Set initial withdrawal fees rate to 0.3%\n feesRateUD7x3 = 300;\n\n // Set initial retention rate to 10%\n retentionRateUD7x3 = 10_000;\n\n // Default withdrawer and fund wallet to contract owner address. This prevents\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\n withdrawer = payable(owner());\n fund = payable(owner());\n }\n\n /**\n * @notice Required override of decimals() which is implemented by both\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\n * decimals amount of the underlying stablecoin token.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function decimals()\n public\n view\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\n returns (uint8)\n {\n return ERC20WrapperUpgradeable.decimals();\n }\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @notice Updates the current withdrawal fee rate.\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\n */\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \"L88\");\n feesRateUD7x3 = feesRateUD7x3_;\n }\n\n /**\n * @notice Updates the current underlying token retention rate.\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\n * deposited assets will ever be exposed in this contract (reduces attack surface).\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\n */\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \"L41\");\n retentionRateUD7x3 = retentionRateUD7x3_;\n }\n\n /**\n * @notice Updates the address of LDYStaking contract.\n * @param ldyStakingAddress The address of the new LDYStaking contract.\n */\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\n require(ldyStakingAddress != address(0), \"L89\");\n ldyStaking = LDYStaking(ldyStakingAddress);\n }\n\n /**\n * @notice Updates the address of the withdrawer wallet.\n * @param withdrawer_ The address of the new withdrawer wallet.\n */\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\n // Ensure address is not the zero address (pre-processing fees would be lost else)\n require(withdrawer_ != address(0), \"L63\");\n\n // Set new withdrawer wallet's address\n withdrawer = withdrawer_;\n }\n\n /**\n * @notice Updates the address of the fund wallet.\n * @param fund_ The address of the new fund wallet.\n */\n function setFund(address payable fund_) public onlyOwner {\n // Ensure address is not the zero address (deposited tokens would be lost else)\n require(fund_ != address(0), \"L64\");\n\n // Set new fund wallet's address\n fund = fund_;\n }\n\n /**\n * @notice Adds a new contract to the L-Token transfers list.\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\n * specified contract will be called.\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\n * contracts that are not owned by the Ledgity team.\n * @param listenerContract The address of the new transfers listener contract.\n */\n function listenToTransfers(address listenerContract) public onlyOwner {\n require(listenerContract != address(0), \"L90\");\n transfersListeners.push(ITransfersListener(listenerContract));\n }\n\n /**\n * @notice Removes a contract from the L-Token transfers list.\n * @dev The onLTokenTransfer() function of the specified contract will not be called\n * anymore each time a L-Token transfer occurs.\n * @param listenerContract The address of the listener contract.\n */\n function unlistenToTransfers(address listenerContract) public onlyOwner {\n // Find index of listener contract in transferListeners array\n int256 index = -1;\n uint256 transfersListenersLength = transfersListeners.length;\n for (uint256 i = 0; i < transfersListenersLength; i++) {\n if (address(transfersListeners[i]) == listenerContract) {\n index = int256(i);\n break;\n }\n }\n\n // Revert if given contract wasn't listening to transfers\n require(index > -1, \"L42\");\n\n // Else, remove transfers listener contract from listeners array\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\n transfersListeners.pop();\n }\n\n /**\n * @notice Retrieves the amount of given account's not yet minted rewards.\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\n * context of LToken, this function returns the amount of rewards that have not been\n * distributed/minted yet to the specified account.\n * @dev This is particularly useful for off-chain services to display charts and\n * statistics, as seen in the Ledgity Yield's frontend.\n * @param account The account to check the unminted rewards of.\n * @return The amount of account's unminted rewards.\n */\n function unmintedRewardsOf(address account) public view returns (uint256) {\n return _rewardsOf(account, true);\n }\n\n /**\n * @notice Retrieves the \"real\" balance of an account, i.e., excluding its not yet\n * minted/distributed rewards.\n * @param account The account to check the real balance of.\n * @return The real balance of the account.\n */\n function realBalanceOf(address account) public view returns (uint256) {\n return super.balanceOf(account);\n }\n\n /**\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\n * not been yet minted to the specified account.\n * @param account The account to check the total balance of.\n * @return The total balance of the account.\n */\n function balanceOf(address account) public view override returns (uint256) {\n return realBalanceOf(account) + unmintedRewardsOf(account);\n }\n\n /**\n * @notice Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\n * @return The real total supply of L-Tokens.\n */\n function realTotalSupply() public view returns (uint256) {\n return super.totalSupply();\n }\n\n /**\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\n * fees and L-Tokens currently in the withdrawal queue.\n * @return The total supply of L-Tokens.\n */\n function totalSupply() public view override returns (uint256) {\n return realTotalSupply() + totalQueued + unclaimedFees;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address.\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\n * token from being the underlying token.\n * @inheritdoc RecoverableUpgradeable\n */\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\n // Ensure the token is not the underlying token\n require(tokenAddress != address(underlying()), \"L43\");\n\n // Proceed to recovery\n super.recoverERC20(tokenAddress, amount);\n }\n\n /**\n * @notice Recovers underlying tokens accidentally sent to the contract.\n * @dev To prevent owner from being able to drain the contract, this function only\n * allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been\n * sent through fund() or deposit() functions.\n */\n function recoverUnderlying() external onlyOwner {\n // Compute the recoverable amount by taking the difference between the contract's\n // balance and the amount of usable underlying tokens\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\n\n // Revert if there is nothing to recover\n require(recoverableAmount > 0, \"L44\");\n\n // Else, proceed to underlying tokens recovery\n super.recoverERC20(address(underlying()), recoverableAmount);\n }\n\n /**\n * @notice Retrieves the amount of underlying tokens invested by the given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\n * LToken contract, the investment of an account is equal to its real balance.\n * @inheritdoc InvestUpgradeable\n */\n function _investmentOf(address account) internal view override returns (uint256) {\n return realBalanceOf(account);\n }\n\n /**\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract so\n * it can distribute rewards to accounts before each period reset.\n * @dev InvestUpgradeable contract already ensure that amount > 0.\n * @inheritdoc InvestUpgradeable\n */\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\n // Inform listeners of the rewards minting\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\n\n // Mint L-Tokens rewards to account\n _mint(account, amount);\n\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\n return true;\n }\n\n /**\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\n * called each time an account's balance is going to change.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\n * @inheritdoc ERC20BaseUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\n\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\n if (from != address(0)) _beforeInvestmentChange(from, true);\n if (to != address(0)) _beforeInvestmentChange(to, true);\n }\n\n /**\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\n * transfers listeners.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already checked in _beforeTokenTransfer().\n * @inheritdoc ERC20Upgradeable\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\n super._afterTokenTransfer(from, to, amount);\n\n // If some L-Token have been burned/minted, inform listeners of a TVL change\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\n\n // Trigger onLTokenTransfer() functions of all the transfers listeners\n for (uint256 i = 0; i < transfersListeners.length; i++) {\n transfersListeners[i].onLTokenTransfer(from, to, amount);\n }\n }\n\n /**\n * @notice Computes the maximum amount of underlying tokens that should be retained\n * by the contract (based on retention rate).\n * @return amount The expected amount of retained underlying tokens.\n */\n function getExpectedRetained() public view returns (uint256 amount) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert totalSupply and retentionRate to SUD\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\n\n // Compute and return expected retained amount\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(expectedRetainedSUD, d);\n }\n\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\n function _transferExceedingToFund() internal {\n // Retrieve the expected amount retained\n uint256 expectedRetained = getExpectedRetained();\n\n // If usable underlyings are less than or equal to expected retained, return\n if (usableUnderlyings <= expectedRetained) return;\n\n // Else, exceeding amount is equal to difference between those values\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= exceedingAmount;\n\n // Transfer the exceeding amount to the fund wallet\n underlying().safeTransfer(fund, exceedingAmount);\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L45\");\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\n * Use deposit() function instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L46\");\n }\n\n /**\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\n * @param amount The amount of underlying tokens to deposit.\n */\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough underlying tokens to deposit\n require(underlying().balanceOf(_msgSender()) >= amount, \"L47\");\n\n // Update usable underlyings balance accordingly\n usableUnderlyings += amount;\n\n // Inform listeners of the deposit activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Deposit,\n amount,\n amount,\n Status.Success,\n NO_ID\n );\n\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\n super.depositFor(_msgSender(), amount);\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\n * given amount.\n * @param account The account initiating the withdrawal.\n * @param amount The amount of the withdrawal.\n */\n function getWithdrawnAmountAndFees(\n address account,\n uint256 amount\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\n // If the account is eligible to staking tier 2, no fees are applied\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\n\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert amount and fees rate to SUD\n uint256 amountSUD = SUD.fromAmount(amount, d);\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\n\n // Compute fees and withdrawn amount (initial amount minus fees)\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\n fees = SUD.toAmount(feesSUD, d);\n withdrawnAmount = amount - fees;\n }\n\n /**\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\n * enough underlying tokens to cover the withdrawal.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestWithdrawal() function otherwise.\n * @param amount The amount L-Tokens to withdraw.\n */\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L48\");\n\n // Can the contract cover this withdrawal plus all already queued requests?\n bool cond1 = totalQueued + amount <= usableUnderlyings;\n\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\n\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\n if (!(cond1 || cond2)) revert(\"L49\");\n\n // Else, retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\n\n // Increase unclaimed fees amount accordingly\n unclaimedFees += fees;\n\n // Decrease usable underlyings balance accordingly\n usableUnderlyings -= withdrawnAmount;\n\n // Inform listeners of this instant withdrawal activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Withdraw,\n amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Burn withdrawal fees from the account\n _burn(_msgSender(), fees);\n\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\n super.withdrawTo(_msgSender(), withdrawnAmount);\n }\n\n /**\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\n * amount of underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n * @param amount The amount L-Tokens to withdraw.\n */\n function requestWithdrawal(\n uint256 amount\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L53\");\n\n // Ensure the requested amount doesn't overflow uint96\n require(amount <= type(uint96).max, \"L54\");\n\n // Ensure the sender attached the pre-paid processing gas fees\n require(msg.value == 0.003 * 10 ** 18, \"L55\");\n\n // Create withdrawal request data\n WithdrawalRequest memory request = WithdrawalRequest({\n account: _msgSender(),\n amount: uint96(amount)\n });\n\n // Will hold the request ID\n uint256 requestId;\n\n // Append request to the withdrawal queue:\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\n withdrawalQueueCursor--;\n requestId = withdrawalQueueCursor;\n withdrawalQueue[requestId] = request;\n }\n // - At the end else\n else {\n withdrawalQueue.push(request);\n requestId = withdrawalQueue.length - 1;\n }\n\n // Increase total amount queued accordingly\n totalQueued += amount;\n\n // Inform listeners of this new queued withdrawal activity event\n emit ActivityEvent(\n int256(requestId),\n _msgSender(),\n Action.Withdraw,\n amount,\n amount,\n Status.Queued,\n NO_ID\n );\n\n // Burn withdrawal L-Tokens amount from account's balance\n _burn(_msgSender(), amount);\n\n // Forward pre-paid processing gas fees to the withdrawer wallet\n (bool sent, ) = withdrawer.call{value: msg.value}(\"\");\n require(sent, \"L56\");\n }\n\n /**\n * @notice Processes queued withdrawal requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n * @dev For further details, see \"LToken > Withdrawals\" section of whitepaper.\n */\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\n // Accumulators variables, will be written on-chain after the loop\n uint256 cumulatedFees = 0;\n uint256 cumulatedWithdrawnAmount = 0;\n uint256 nextRequestId = withdrawalQueueCursor;\n\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\n // requests are increasing the queue length when moved at the end of the queue.\n uint256 queueLength = withdrawalQueue.length;\n\n // Iterate over requests to be processed\n while (nextRequestId < queueLength) {\n // Stop processing requests if there is not enough gas left to continue the\n // loop and properly end the function call. This prevents an attacker from\n // blocking the withdrawal processing by creating a ton of tiny requests so\n // this function call cannot fit anymore in block gas limit.\n if (gasleft() < 45000) break;\n\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\n\n // Skip empty request (processed big requests or cancelled requests)\n if (request.account == address(0)) {}\n //\n // If account has been blacklisted since request emission\n else if (isBlacklisted(request.account)) {\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request in the frozen requests list\n frozenRequests.push(request);\n }\n //\n // Or if request is a big request, move it at the end of the queue for now.\n // This request will be processed manually later using processBigQueuedRequest()\n else if (request.amount > getExpectedRetained() / 2) {\n // Inform listeners of this queued request being moved at the end of the queue\n emit ActivityEvent(\n int256(nextRequestId),\n _msgSender(),\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Moved,\n int256(withdrawalQueue.length)\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request at the end of the queue\n withdrawalQueue.push(request);\n }\n //\n // Else, continue request processing\n else {\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Break if the contract doesn't hold enough funds to cover the request\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\n\n // Accumulate fees and withdrawn amount\n cumulatedFees += fees;\n cumulatedWithdrawnAmount += withdrawnAmount;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(nextRequestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Transfer underlying tokens to account. Burning L-Tokens is not required\n // as equestWithdrawal() already did it.\n // Security note: Re-entrancy warning are disabled as the request has\n // just been deleted from the queue, it will so be skipped if trying to\n // process it again.\n // slither-disable-next-line reentrancy-no-eth\n underlying().safeTransfer(request.account, withdrawnAmount);\n }\n\n // Increment next request ID\n nextRequestId++;\n }\n\n // Increase unclaimed fees by the amount of cumulated fees\n unclaimedFees += cumulatedFees;\n\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\n usableUnderlyings -= cumulatedWithdrawnAmount;\n\n // Decrease total amount queued by the cumulated amount requested\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\n\n // Update new queue cursor\n withdrawalQueueCursor = nextRequestId;\n\n // Retention rate cannot exceeds as the withdrawal decreases both usable\n // underlyings and expected retained amounts by the same number and as the\n // expected retained amount is a subset of usable underlyings amount.\n }\n\n /**\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\n * the retention rate).\n * @dev In contrast to non-big requests processing, this function will uses to fund\n * wallet's balance to fill the request. This allows processing requests that are\n * greater than retention rate without having to exceed this rate on the contract.\n * @param requestId The ID of the big request to process.\n */\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure the request is active\n require(request.account != address(0), \"L66\");\n\n // Ensure the request emitter has not been blacklisted since request emission\n require(!isBlacklisted(request.account), \"L50\");\n\n // Ensure this is indeed a big request\n require(request.amount > getExpectedRetained() / 2, \"L51\");\n\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\n uint256 fundBalance = underlying().balanceOf(fund);\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \"L52\");\n\n // Increase amount of unclaimed fees accordingly\n unclaimedFees += fees;\n\n // Decrease total queued amount by request amount\n totalQueued -= request.amount;\n\n // Increment queue cursor if request was the next request to be processed\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[requestId];\n\n // If fund wallet's balance can cover request, rely on it only\n if (withdrawnAmount <= fundBalance) {\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\n }\n // Else, cover request from both fund wallet and contract balances\n else {\n // Compute amount missing from fund wallet to cover request\n uint256 missingAmount = withdrawnAmount - fundBalance;\n\n // Decrease usable amount of underlying tokens accordingly\n usableUnderlyings -= missingAmount;\n\n // Transfer entire fund balance to request's emitter\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\n\n // Transfer missing amount from contract balance to request emitter\n underlying().safeTransfer(request.account, missingAmount);\n }\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Cancels a given withdrawal request. The request emitter receive back its\n * L-Tokens and no fees will be charged.\n * @param requestId The ID of the withdrawal request to cancel.\n */\n function cancelWithdrawalRequest(\n uint256 requestId\n ) public whenNotPaused notBlacklisted(_msgSender()) {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure request belongs to caller\n require(_msgSender() == request.account, \"L57\");\n\n // Decrease total amount queued accordingly\n totalQueued -= request.amount;\n\n // Delete the withdrawal request from queue\n delete withdrawalQueue[requestId];\n\n // Inform listeners of this cancelled withdrawal request activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Cancelled,\n NO_ID\n );\n\n // Mint back L-Tokens to account\n _mint(request.account, uint256(request.amount));\n }\n\n /**\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\n * whenever those are required to fulfill some withdrawal requests.\n * @dev The function will revert if repatriated amount makes the contract exceeding\n * the retention rate.\n * @param amount The amount of underlying tokens to repatriate.\n */\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\n // Ensure the fund wallet has enough funds to repatriate\n require(amount <= underlying().balanceOf(fund), \"L58\");\n\n // Calculate new contract usable balance\n uint256 newBalance = usableUnderlyings + amount;\n\n // Ensure the new balance doesn't exceed the retention rate\n require(newBalance <= getExpectedRetained(), \"L59\");\n\n // Increase usable underlyings amount by repatriated amount\n usableUnderlyings += amount;\n\n // Transfer amount from fund wallet to contract\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\n }\n\n /// @notice Used by owner to claim fees generated from successful withdrawals.\n function claimFees() external onlyOwner {\n // Ensure there are some fees to claim\n require(unclaimedFees > 0, \"L60\");\n\n // Ensure the contract holds enough underlying tokens to cover fees\n require(usableUnderlyings >= unclaimedFees, \"L61\");\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= unclaimedFees;\n\n // Store fees amount in memory and reset unclaimed fees amount\n uint256 fees = unclaimedFees;\n unclaimedFees = 0;\n\n // Transfer unclaimed fees to owner\n underlying().safeTransfer(owner(), fees);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ERC20WrapperUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\";\nimport \"./abstracts/base/ERC20BaseUpgradeable.sol\";\nimport {InvestUpgradeable} from \"./abstracts/InvestUpgradeable.sol\";\nimport {LDYStaking} from \"./LDYStaking.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {SUD} from \"./libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\nimport {ITransfersListener} from \"./interfaces/ITransfersListener.sol\";\n\n/**\n * @title LToken\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\n * the form of additional L-Tokens, which are auto-compounded over time.\n *\n * @dev Definitions:\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\n * - Instant: Processed immediately.\n * - Request: Queued for later processing.\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\n * - Request ID: The index of a withdrawal request in the queue array.\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\n * expected ways and are so considered safe to use by the contract.\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\n * processing.\n *\n * Note that words between parenthesis are sometimes omitted for brevity.\n *\n * @dev Deployment notice:\n * This contract can safely receive funds immediately after initialization. (i.e., there\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\n * replace ASAP owner and fund wallets with multi-sig wallets.\n *\n * @dev For further details, see \"LToken\" section of whitepaper.\n * @custom:oz-upgrades-unsafe-allow external-library-linking\n * @custom:security-contact security@ledgity.com\n */\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /// @dev Represents type of actions triggering ActivityEvent events.\n enum Action {\n Deposit,\n Withdraw\n }\n\n /// @dev Represents different status of actions triggering ActivityEvent events.\n enum Status {\n Queued,\n Cancelled,\n Success,\n Moved\n }\n\n /**\n * @notice Represents a withdrawal request in the queue.\n * @dev A request fits in a single storage slot (32 bytes).\n * @param account The account that initiated the request.\n * @param amount The amount of underlying tokens requested.\n */\n struct WithdrawalRequest {\n address account; // 20 bytes\n uint96 amount; // 12 bytes\n }\n\n /// @notice Upper limit of retention rate.\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\n\n /// @notice Upper limit of fees rate.\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\n\n /// @notice Used in activity events to represent the absence of request ID.\n int256 private constant NO_ID = -1;\n\n /// @notice Holds a reference to the LDYStaking contract.\n LDYStaking public ldyStaking;\n\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\n address payable public withdrawer;\n\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\n address public fund;\n\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\n uint32 public feesRateUD7x3;\n\n /// @notice Holds the retention rate in UD7x3 format.\n uint32 public retentionRateUD7x3;\n\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\n uint256 public unclaimedFees;\n\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\n uint256 public totalQueued;\n\n /**\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\n */\n uint256 public usableUnderlyings;\n\n /// @notice Holds an ordered list of active withdrawal requests.\n WithdrawalRequest[] public withdrawalQueue;\n\n /// @notice Holds the index of the next withdrawal request to process in the queue.\n uint256 public withdrawalQueueCursor;\n\n /**\n * @notice Holds a list of all currently frozen withdrawal requests.\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\n * it from blocking the queue.\n */\n WithdrawalRequest[] public frozenRequests;\n\n /**\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\n */\n ITransfersListener[] public transfersListeners;\n\n /**\n * @notice Emitted to inform listeners about a change in the contract's TVL.\n * @dev TVL = realTotalSupply()\n * @param newTVL The new TVL of the contract.\n */\n event TVLChangeEvent(uint256 newTVL);\n\n /**\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\n * @param account The account involved in the activity.\n * @param action The type of activity.\n * @param amount The amount of underlying tokens involved in the activity.\n * @param newStatus The new status of the activity.\n * @param newId The new ID of the request if it has been moved in the queue.\n */\n event ActivityEvent(\n int256 indexed id,\n address indexed account,\n Action indexed action,\n uint256 amount,\n uint256 amountAfterFees,\n Status newStatus,\n int256 newId\n );\n\n /**\n * @notice Emitted to inform listeners that some rewards have been minted.\n * @param account The account that received the rewards.\n * @param balanceBefore The balance of the account before the minting.\n * @param rewards The amount of minted rewards.\n */\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\n\n /// @notice Reverts if the function caller is not the withdrawer wallet.\n modifier onlyWithdrawer() {\n require(_msgSender() == withdrawer, \"L39\");\n _;\n }\n\n /// @notice Reverts if the function caller is not the fund wallet.\n modifier onlyFund() {\n require(_msgSender() == fund, \"L40\");\n _;\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address ldyStaking_,\n address underlyingToken\n ) public initializer {\n // Initialize ERC20 base.\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\n __ERC20Base_init(\n globalOwner_,\n globalPause_,\n globalBlacklist_,\n string(abi.encodePacked(\"Ledgity \", underlyingSymbol)),\n string(abi.encodePacked(\"L\", underlyingSymbol))\n );\n\n // IMPORTANT: Below calls must not be restricted to owner at any point.\n // This is because the GlobalOwner contract may not be a fresh one, and so\n // the contract deployer may not be the owner anymore after ERC20Base init.\n\n // Initialize other parents contracts.\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\n __Invest_init_unchained(address(this));\n\n // Set LDYStaking contract\n ldyStaking = LDYStaking(ldyStaking_);\n\n // Set initial withdrawal fees rate to 0.3%\n feesRateUD7x3 = 300;\n\n // Set initial retention rate to 10%\n retentionRateUD7x3 = 10_000;\n\n // Default withdrawer and fund wallet to contract owner address. This prevents\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\n withdrawer = payable(owner());\n fund = payable(owner());\n }\n\n /**\n * @notice Required override of decimals() which is implemented by both\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\n * decimals amount of the underlying stablecoin token.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function decimals()\n public\n view\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\n returns (uint8)\n {\n return ERC20WrapperUpgradeable.decimals();\n }\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @notice Updates the current withdrawal fee rate.\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\n */\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \"L88\");\n feesRateUD7x3 = feesRateUD7x3_;\n }\n\n /**\n * @notice Updates the current underlying token retention rate.\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\n * deposited assets will ever be exposed in this contract (reduces attack surface).\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\n */\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \"L41\");\n retentionRateUD7x3 = retentionRateUD7x3_;\n }\n\n /**\n * @notice Updates the address of LDYStaking contract.\n * @param ldyStakingAddress The address of the new LDYStaking contract.\n */\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\n ldyStaking = LDYStaking(ldyStakingAddress);\n }\n\n /**\n * @notice Updates the address of the withdrawer wallet.\n * @param withdrawer_ The address of the new withdrawer wallet.\n */\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\n // Ensure address is not the zero address (pre-processing fees would be lost else)\n require(withdrawer_ != address(0), \"L63\");\n\n // Set new withdrawer wallet's address\n withdrawer = withdrawer_;\n }\n\n /**\n * @notice Updates the address of the fund wallet.\n * @param fund_ The address of the new fund wallet.\n */\n function setFund(address payable fund_) public onlyOwner {\n // Ensure address is not the zero address (deposited tokens would be lost else)\n require(fund_ != address(0), \"L64\");\n\n // Set new fund wallet's address\n fund = fund_;\n }\n\n /**\n * @notice Adds a new contract to the L-Token transfers list.\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\n * specified contract will be called.\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\n * contracts that are not owned by the Ledgity team.\n * @param listenerContract The address of the new transfers listener contract.\n */\n function listenToTransfers(address listenerContract) public onlyOwner {\n transfersListeners.push(ITransfersListener(listenerContract));\n }\n\n /**\n * @notice Removes a contract from the L-Token transfers list.\n * @dev The onLTokenTransfer() function of the specified contract will not be called\n * anymore each time a L-Token transfer occurs.\n * @param listenerContract The address of the listener contract.\n */\n function unlistenToTransfers(address listenerContract) public onlyOwner {\n // Find index of listener contract in transferListeners array\n int256 index = -1;\n uint256 transfersListenersLength = transfersListeners.length;\n for (uint256 i = 0; i < transfersListenersLength; i++) {\n if (address(transfersListeners[i]) == listenerContract) {\n index = int256(i);\n break;\n }\n }\n\n // Revert if given contract wasn't listening to transfers\n require(index > -1, \"L42\");\n\n // Else, remove transfers listener contract from listeners array\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\n transfersListeners.pop();\n }\n\n /**\n * @notice Retrieves the amount of given account's not yet minted rewards.\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\n * context of LToken, this function returns the amount of rewards that have not been\n * distributed/minted yet to the specified account.\n * @dev This is particularly useful for off-chain services to display charts and\n * statistics, as seen in the Ledgity Yield's frontend.\n * @param account The account to check the unminted rewards of.\n * @return The amount of account's unminted rewards.\n */\n function unmintedRewardsOf(address account) public view returns (uint256) {\n return _rewardsOf(account, true);\n }\n\n /**\n * @notice Retrieves the \"real\" balance of an account, i.e., excluding its not yet\n * minted/distributed rewards.\n * @param account The account to check the real balance of.\n * @return The real balance of the account.\n */\n function realBalanceOf(address account) public view returns (uint256) {\n return super.balanceOf(account);\n }\n\n /**\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\n * not been yet minted to the specified account.\n * @param account The account to check the total balance of.\n * @return The total balance of the account.\n */\n function balanceOf(address account) public view override returns (uint256) {\n return realBalanceOf(account) + unmintedRewardsOf(account);\n }\n\n /**\n * @notice Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\n * @return The real total supply of L-Tokens.\n */\n function realTotalSupply() public view returns (uint256) {\n return super.totalSupply();\n }\n\n /**\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\n * fees and L-Tokens currently in the withdrawal queue.\n * @return The total supply of L-Tokens.\n */\n function totalSupply() public view override returns (uint256) {\n return realTotalSupply() + totalQueued + unclaimedFees;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address.\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\n * token from being the underlying token.\n * @inheritdoc RecoverableUpgradeable\n */\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\n // Ensure the token is not the underlying token\n require(tokenAddress != address(underlying()), \"L43\");\n\n // Proceed to recovery\n super.recoverERC20(tokenAddress, amount);\n }\n\n /**\n * @notice Recovers underlying tokens accidentally sent to the contract.\n * @dev To prevent owner from being able to drain the contract, this function only\n * allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been\n * sent through fund() or deposit() functions.\n */\n function recoverUnderlying() external onlyOwner {\n // Compute the recoverable amount by taking the difference between the contract's\n // balance and the amount of usable underlying tokens\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\n\n // Revert if there is nothing to recover\n require(recoverableAmount > 0, \"L44\");\n\n // Else, proceed to underlying tokens recovery\n super.recoverERC20(address(underlying()), recoverableAmount);\n }\n\n /**\n * @notice Retrieves the amount of underlying tokens invested by the given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\n * LToken contract, the investment of an account is equal to its real balance.\n * @inheritdoc InvestUpgradeable\n */\n function _investmentOf(address account) internal view override returns (uint256) {\n return realBalanceOf(account);\n }\n\n /**\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract so\n * it can distribute rewards to accounts before each period reset.\n * @dev InvestUpgradeable contract already ensure that amount > 0.\n * @inheritdoc InvestUpgradeable\n */\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\n // Inform listeners of the rewards minting\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\n\n // Mint L-Tokens rewards to account\n _mint(account, amount);\n\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\n return true;\n }\n\n /**\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\n * called each time an account's balance is going to change.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\n * @inheritdoc ERC20BaseUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\n\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\n if (from != address(0)) _beforeInvestmentChange(from, true);\n if (to != address(0)) _beforeInvestmentChange(to, true);\n }\n\n /**\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\n * transfers listeners.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already checked in _beforeTokenTransfer().\n * @inheritdoc ERC20Upgradeable\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\n super._afterTokenTransfer(from, to, amount);\n\n // If some L-Token have been burned/minted, inform listeners of a TVL change\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\n\n // Trigger onLTokenTransfer() functions of all the transfers listeners\n for (uint256 i = 0; i < transfersListeners.length; i++) {\n transfersListeners[i].onLTokenTransfer(from, to, amount);\n }\n }\n\n /**\n * @notice Computes the maximum amount of underlying tokens that should be retained\n * by the contract (based on retention rate).\n * @return amount The expected amount of retained underlying tokens.\n */\n function getExpectedRetained() public view returns (uint256 amount) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert totalSupply and retentionRate to SUD\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\n\n // Compute and return expected retained amount\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(expectedRetainedSUD, d);\n }\n\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\n function _transferExceedingToFund() internal {\n // Retrieve the expected amount retained\n uint256 expectedRetained = getExpectedRetained();\n\n // If usable underlyings are less than or equal to expected retained, return\n if (usableUnderlyings <= expectedRetained) return;\n\n // Else, exceeding amount is equal to difference between those values\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= exceedingAmount;\n\n // Transfer the exceeding amount to the fund wallet\n underlying().safeTransfer(fund, exceedingAmount);\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L45\");\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\n * Use deposit() function instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L46\");\n }\n\n /**\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\n * @param amount The amount of underlying tokens to deposit.\n */\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough underlying tokens to deposit\n require(underlying().balanceOf(_msgSender()) >= amount, \"L47\");\n\n // Update usable underlyings balance accordingly\n usableUnderlyings += amount;\n\n // Inform listeners of the deposit activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Deposit,\n amount,\n amount,\n Status.Success,\n NO_ID\n );\n\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\n super.depositFor(_msgSender(), amount);\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\n * given amount.\n * @param account The account initiating the withdrawal.\n * @param amount The amount of the withdrawal.\n */\n function getWithdrawnAmountAndFees(\n address account,\n uint256 amount\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\n // If the account is eligible to staking tier 2, no fees are applied\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\n\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert amount and fees rate to SUD\n uint256 amountSUD = SUD.fromAmount(amount, d);\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\n\n // Compute fees and withdrawn amount (initial amount minus fees)\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\n fees = SUD.toAmount(feesSUD, d);\n withdrawnAmount = amount - fees;\n }\n\n /**\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\n * enough underlying tokens to cover the withdrawal.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestWithdrawal() function otherwise.\n * @param amount The amount L-Tokens to withdraw.\n */\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L48\");\n\n // Can the contract cover this withdrawal plus all already queued requests?\n bool cond1 = totalQueued + amount <= usableUnderlyings;\n\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\n\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\n if (!(cond1 || cond2)) revert(\"L49\");\n\n // Else, retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\n\n // Increase unclaimed fees amount accordingly\n unclaimedFees += fees;\n\n // Decrease usable underlyings balance accordingly\n usableUnderlyings -= withdrawnAmount;\n\n // Inform listeners of this instant withdrawal activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Withdraw,\n amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Burn withdrawal fees from the account\n _burn(_msgSender(), fees);\n\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\n super.withdrawTo(_msgSender(), withdrawnAmount);\n }\n\n /**\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\n * amount of underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n * @param amount The amount L-Tokens to withdraw.\n */\n function requestWithdrawal(\n uint256 amount\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L53\");\n\n // Ensure the requested amount doesn't overflow uint96\n require(amount <= type(uint96).max, \"L54\");\n\n // Ensure the sender attached the pre-paid processing gas fees\n require(msg.value == 0.003 * 10 ** 18, \"L55\");\n\n // Create withdrawal request data\n WithdrawalRequest memory request = WithdrawalRequest({\n account: _msgSender(),\n amount: uint96(amount)\n });\n\n // Will hold the request ID\n uint256 requestId;\n\n // Append request to the withdrawal queue:\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\n withdrawalQueueCursor--;\n requestId = withdrawalQueueCursor;\n withdrawalQueue[requestId] = request;\n }\n // - At the end else\n else {\n withdrawalQueue.push(request);\n requestId = withdrawalQueue.length - 1;\n }\n\n // Increase total amount queued accordingly\n totalQueued += amount;\n\n // Inform listeners of this new queued withdrawal activity event\n emit ActivityEvent(\n int256(requestId),\n _msgSender(),\n Action.Withdraw,\n amount,\n amount,\n Status.Queued,\n NO_ID\n );\n\n // Burn withdrawal L-Tokens amount from account's balance\n _burn(_msgSender(), amount);\n\n // Forward pre-paid processing gas fees to the withdrawer wallet\n (bool sent, ) = withdrawer.call{value: msg.value}(\"\");\n require(sent, \"L56\");\n }\n\n /**\n * @notice Processes queued withdrawal requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n * @dev For further details, see \"LToken > Withdrawals\" section of whitepaper.\n */\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\n // Accumulators variables, will be written on-chain after the loop\n uint256 cumulatedFees = 0;\n uint256 cumulatedWithdrawnAmount = 0;\n uint256 nextRequestId = withdrawalQueueCursor;\n\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\n // requests are increasing the queue length when moved at the end of the queue.\n uint256 queueLength = withdrawalQueue.length;\n\n // Iterate over requests to be processed\n while (nextRequestId < queueLength) {\n // Stop processing requests if there is not enough gas left to continue the\n // loop and properly end the function call. This prevents an attacker from\n // blocking the withdrawal processing by creating a ton of tiny requests so\n // this function call cannot fit anymore in block gas limit.\n if (gasleft() < 45000) break;\n\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\n\n // Skip empty request (processed big requests or cancelled requests)\n if (request.account == address(0)) {}\n //\n // If account has been blacklisted since request emission\n else if (isBlacklisted(request.account)) {\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request in the frozen requests list\n frozenRequests.push(request);\n }\n //\n // Or if request is a big request, move it at the end of the queue for now.\n // This request will be processed manually later using processBigQueuedRequest()\n else if (request.amount > getExpectedRetained() / 2) {\n // Inform listeners of this queued request being moved at the end of the queue\n emit ActivityEvent(\n int256(nextRequestId),\n _msgSender(),\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Moved,\n int256(withdrawalQueue.length)\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request at the end of the queue\n withdrawalQueue.push(request);\n }\n //\n // Else, continue request processing\n else {\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Break if the contract doesn't hold enough funds to cover the request\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\n\n // Accumulate fees and withdrawn amount\n cumulatedFees += fees;\n cumulatedWithdrawnAmount += withdrawnAmount;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(nextRequestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Transfer underlying tokens to account. Burning L-Tokens is not required\n // as equestWithdrawal() already did it.\n // Security note: Re-entrancy warning are disabled as the request has\n // just been deleted from the queue, it will so be skipped if trying to\n // process it again.\n // slither-disable-next-line reentrancy-no-eth\n underlying().safeTransfer(request.account, withdrawnAmount);\n }\n\n // Increment next request ID\n nextRequestId++;\n }\n\n // Increase unclaimed fees by the amount of cumulated fees\n unclaimedFees += cumulatedFees;\n\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\n usableUnderlyings -= cumulatedWithdrawnAmount;\n\n // Decrease total amount queued by the cumulated amount requested\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\n\n // Update new queue cursor\n withdrawalQueueCursor = nextRequestId;\n\n // Retention rate cannot exceeds as the withdrawal decreases both usable\n // underlyings and expected retained amounts by the same number and as the\n // expected retained amount is a subset of usable underlyings amount.\n }\n\n /**\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\n * the retention rate).\n * @dev In contrast to non-big requests processing, this function will uses to fund\n * wallet's balance to fill the request. This allows processing requests that are\n * greater than retention rate without having to exceed this rate on the contract.\n * @param requestId The ID of the big request to process.\n */\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure the request is active\n require(request.account != address(0), \"L66\");\n\n // Ensure the request emitter has not been blacklisted since request emission\n require(!isBlacklisted(request.account), \"L50\");\n\n // Ensure this is indeed a big request\n require(request.amount > getExpectedRetained() / 2, \"L51\");\n\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\n uint256 fundBalance = underlying().balanceOf(fund);\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \"L52\");\n\n // Increase amount of unclaimed fees accordingly\n unclaimedFees += fees;\n\n // Decrease total queued amount by request amount\n totalQueued -= request.amount;\n\n // Increment queue cursor if request was the next request to be processed\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[requestId];\n\n // If fund wallet's balance can cover request, rely on it only\n if (withdrawnAmount <= fundBalance) {\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\n }\n // Else, cover request from both fund wallet and contract balances\n else {\n // Compute amount missing from fund wallet to cover request\n uint256 missingAmount = withdrawnAmount - fundBalance;\n\n // Decrease usable amount of underlying tokens accordingly\n usableUnderlyings -= missingAmount;\n\n // Transfer entire fund balance to request's emitter\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\n\n // Transfer missing amount from contract balance to request emitter\n underlying().safeTransfer(request.account, missingAmount);\n }\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Cancels a given withdrawal request. The request emitter receive back its\n * L-Tokens and no fees will be charged.\n * @param requestId The ID of the withdrawal request to cancel.\n */\n function cancelWithdrawalRequest(\n uint256 requestId\n ) public whenNotPaused notBlacklisted(_msgSender()) {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure request belongs to caller\n require(_msgSender() == request.account, \"L57\");\n\n // Decrease total amount queued accordingly\n totalQueued -= request.amount;\n\n // Delete the withdrawal request from queue\n delete withdrawalQueue[requestId];\n\n // Inform listeners of this cancelled withdrawal request activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Cancelled,\n NO_ID\n );\n\n // Mint back L-Tokens to account\n _mint(request.account, uint256(request.amount));\n }\n\n /**\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\n * whenever those are required to fulfill some withdrawal requests.\n * @dev The function will revert if repatriated amount makes the contract exceeding\n * the retention rate.\n * @param amount The amount of underlying tokens to repatriate.\n */\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\n // Ensure the fund wallet has enough funds to repatriate\n require(amount <= underlying().balanceOf(fund), \"L58\");\n\n // Calculate new contract usable balance\n uint256 newBalance = usableUnderlyings + amount;\n\n // Ensure the new balance doesn't exceed the retention rate\n require(newBalance <= getExpectedRetained(), \"L59\");\n\n // Increase usable underlyings amount by repatriated amount\n usableUnderlyings += amount;\n\n // Transfer amount from fund wallet to contract\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\n }\n\n /// @notice Used by owner to claim fees generated from successful withdrawals.\n function claimFees() external onlyOwner {\n // Ensure there are some fees to claim\n require(unclaimedFees > 0, \"L60\");\n\n // Ensure the contract holds enough underlying tokens to cover fees\n require(usableUnderlyings >= unclaimedFees, \"L61\");\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= unclaimedFees;\n\n // Store fees amount in memory and reset unclaimed fees amount\n uint256 fees = unclaimedFees;\n unclaimedFees = 0;\n\n // Transfer unclaimed fees to owner\n underlying().safeTransfer(owner(), fees);\n }\n}\n" }, "contracts/src/LTokenSignaler.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title LTokenSignaler\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\n * signaled, a L-Token will start being indexed.\n *\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\n * @param lTokenAddress The address of the L-Token contract to signal.\n */\n event LTokenSignalEvent(address indexed lTokenAddress);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\n * @param lTokenAddress The address of the LToken contract to signal.\n */\n function signalLToken(address lTokenAddress) external onlyOwner {\n // Signal the LToken contract\n emit LTokenSignalEvent(lTokenAddress);\n }\n}\n" diff --git a/contracts/hardhat/deployments/baseSepolia/solcInputs/c8300f1cd6a8c81a83ee050186e6d667.json b/contracts/hardhat/deployments/baseSepolia/solcInputs/c8300f1cd6a8c81a83ee050186e6d667.json new file mode 100644 index 00000000..0b50d0de --- /dev/null +++ b/contracts/hardhat/deployments/baseSepolia/solcInputs/c8300f1cd6a8c81a83ee050186e6d667.json @@ -0,0 +1,165 @@ +{ + "language": "Solidity", + "sources": { + "@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" + }, + "@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" + }, + "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822ProxiableUpgradeable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeaconUpgradeable {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport \"../utils/Initializable.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n function __ERC1967Upgrade_init() internal onlyInitializing {\n }\n\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n }\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n }\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" + }, + "@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" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n function __UUPSUpgradeable_init() internal onlyInitializing {\n }\n\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n }\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n *\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function upgradeTo(address newImplementation) public virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n *\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\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" + }, + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\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 /**\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[45] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20Upgradeable.sol\";\nimport \"../../../security/PausableUpgradeable.sol\";\nimport \"../../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev ERC20 token with pausable token transfers, minting and burning.\n *\n * Useful for scenarios such as preventing trades until the end of an evaluation\n * period, or having an emergency switch for freezing all token transfers in the\n * event of a large bug.\n *\n * IMPORTANT: This contract does not include public pause and unpause functions. In\n * addition to inheriting this contract, you must define both functions, invoking the\n * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate\n * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will\n * make the contract unpausable.\n */\nabstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {\n function __ERC20Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __ERC20Pausable_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev See {ERC20-_beforeTokenTransfer}.\n *\n * Requirements:\n *\n * - the contract must not be paused.\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._beforeTokenTransfer(from, to, amount);\n\n require(!paused(), \"ERC20Pausable: token transfer while paused\");\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Wrapper.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20Upgradeable.sol\";\nimport \"../utils/SafeERC20Upgradeable.sol\";\nimport \"../../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Extension of the ERC20 token contract to support token wrapping.\n *\n * Users can deposit and withdraw \"underlying tokens\" and receive a matching number of \"wrapped tokens\". This is useful\n * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the\n * wrapping of an existing \"basic\" ERC20 into a governance token.\n *\n * _Available since v4.2._\n *\n * @custom:storage-size 51\n */\nabstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {\n IERC20Upgradeable private _underlying;\n\n function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing {\n __ERC20Wrapper_init_unchained(underlyingToken);\n }\n\n function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing {\n require(underlyingToken != this, \"ERC20Wrapper: cannot self wrap\");\n _underlying = underlyingToken;\n }\n\n /**\n * @dev See {ERC20-decimals}.\n */\n function decimals() public view virtual override returns (uint8) {\n try IERC20MetadataUpgradeable(address(_underlying)).decimals() returns (uint8 value) {\n return value;\n } catch {\n return super.decimals();\n }\n }\n\n /**\n * @dev Returns the address of the underlying ERC-20 token that is being wrapped.\n */\n function underlying() public view returns (IERC20Upgradeable) {\n return _underlying;\n }\n\n /**\n * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\n */\n function depositFor(address account, uint256 amount) public virtual returns (bool) {\n address sender = _msgSender();\n require(sender != address(this), \"ERC20Wrapper: wrapper can't deposit\");\n SafeERC20Upgradeable.safeTransferFrom(_underlying, sender, address(this), amount);\n _mint(account, amount);\n return true;\n }\n\n /**\n * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\n */\n function withdrawTo(address account, uint256 amount) public virtual returns (bool) {\n _burn(_msgSender(), amount);\n SafeERC20Upgradeable.safeTransfer(_underlying, account, amount);\n return true;\n }\n\n /**\n * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal\n * function that can be exposed with access control if desired.\n */\n function _recover(address account) internal virtual returns (uint256) {\n uint256 value = _underlying.balanceOf(address(this)) - totalSupply();\n _mint(account, value);\n return value;\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.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 \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\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" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../extensions/IERC20PermitUpgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n * 0 before setting it to a non-zero value.\n */\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20PermitUpgradeable token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\n }\n}\n" + }, + "@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" + }, + "@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" + }, + "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n 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" + }, + "@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" + }, + "@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" + }, + "@openzeppelin/contracts/security/Pausable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n constructor() {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" + }, + "@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" + }, + "@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" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n * 0 before setting it to a non-zero value.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.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 Address {\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" + }, + "@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" + }, + "contracts/src/abstracts/base/BaseUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"../GlobalPausableUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"../GlobalOwnableUpgradeable.sol\";\nimport {GlobalRestrictableUpgradeable} from \"../GlobalRestrictableUpgradeable.sol\";\nimport {RecoverableUpgradeable} from \"../RecoverableUpgradeable.sol\";\n\n/**\n * @title BaseUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\n * minimizing code repetition and enhancing readability and maintainability.\n *\n * @dev For further details, see \"Base\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract BaseUpgradeable is\n Initializable,\n UUPSUpgradeable,\n GlobalOwnableUpgradeable,\n GlobalPausableUpgradeable,\n GlobalRestrictableUpgradeable,\n RecoverableUpgradeable\n{\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n */\n function __Base_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_\n ) internal onlyInitializing {\n __UUPSUpgradeable_init();\n __GlobalOwnable_init(globalOwner_);\n __Pausable_init();\n __GlobalPausable_init_unchained(globalPause_);\n __GlobalRestrictable_init_unchained(globalBlacklist_);\n __Recoverable_init_unchained();\n }\n\n function __Base_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/base/ERC20BaseUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {ERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\nimport {ERC20PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"./BaseUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"../GlobalPausableUpgradeable.sol\";\n\n/**\n * @title ERC20BaseUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This abstract contract is an extension of BaseUpgradeable intended to be used\n * as a base for ERC20 tokens contracts.\n *\n * @dev For further details, see \"ERC20BaseUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract ERC20BaseUpgradeable is\n ERC20Upgradeable,\n BaseUpgradeable,\n ERC20PausableUpgradeable\n{\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param name_ The display name of the token.\n * @param symbol_ The symbol of the token.\n */\n function __ERC20Base_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n string memory name_,\n string memory symbol_\n ) internal onlyInitializing {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n __ERC20_init(name_, symbol_);\n __ERC20Pausable_init_unchained();\n }\n\n function __ERC20Base_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and PausableUpgradeable parent contracts.\n * The GlobalPausableUpgradeable version is preferred because it checks the pause\n * state from the GlobalPause contract.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, PausableUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @dev Required override of _beforeTokenTransfer() which is implemented by both\n * ERC20PausableUpgradeable and ERC20Upgradeable parent contracts.\n * The ERC20PausableUpgradeable version is preferred because it also checks that\n * the contract is not paused before allowing the transfer.\n * @inheritdoc ERC20PausableUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n )\n internal\n virtual\n override(ERC20PausableUpgradeable, ERC20Upgradeable)\n whenNotPaused\n notBlacklisted(from)\n notBlacklisted(to)\n {\n ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/GlobalOwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {OwnableUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {GlobalOwner} from \"../GlobalOwner.sol\";\n\n/**\n * @title GlobalOwnableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\n * contract (see GlobalOwner.sol). This design facilitates centralized management\n * of ownership for all the Ledgity Yield contracts.\n *\n * @dev Security measure:\n * The _globalOwner state must be set at initialization time and, for evident security\n * reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalOwnableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\n /**\n * @notice The GlobalOwner contract the ownership will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalOwner private _globalOwner;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\n __GlobalOwnable_init_unchained(globalOwner_);\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\n // the initial _owner value, calling it would have no effect.\n }\n\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\n _globalOwner = GlobalOwner(globalOwner_);\n }\n\n /**\n * @notice Retrieves the address of GlobalOwner contract.\n * @return The address of the GlobalOwner contract.\n */\n function globalOwner() public view returns (address) {\n return address(_globalOwner);\n }\n\n /**\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\n * from the GlobalOwner contract instead.\n * @return The address of the owner\n */\n function owner() public view override returns (address) {\n return _globalOwner.owner();\n }\n\n /**\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\n * Ownership is managed by the GlobalOwner contract and must be modified there.\n */\n function transferOwnership(address newOwner) public view override onlyOwner {\n newOwner; // Silence unused variable compiler warning\n revert(\"L8\");\n }\n\n /**\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\n * Ownership is managed by the GlobalOwner contract and must be modified there.\n */\n function renounceOwnership() public view override onlyOwner {\n revert(\"L65\");\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/GlobalPausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {GlobalPause} from \"../GlobalPause.sol\";\n\n/**\n * @title GlobalPausableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\n * contract (see GlobalPause.sol). This design facilitates centralized management of\n * pause state for all the Ledgity Yield contracts.\n *\n * @dev Security measure\n * The _globalPause state must be set at initialization time and, for evident security\n * reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalPausableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\n /**\n * @notice The GlobalPause contract the pause state will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalPause private _globalPause;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalPause_ The address of the GlobalPause contract.\n */\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\n __Pausable_init();\n __GlobalPausable_init_unchained(globalPause_);\n }\n\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\n _globalPause = GlobalPause(globalPause_);\n }\n\n /**\n * @notice Retrieves the address of GlobalPause contract.\n * @return The address of the GlobalPause contract.\n */\n function globalPause() public view returns (address) {\n return address(_globalPause);\n }\n\n /**\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\n * from the GlobalPause contract instead.\n * @return Whether the contract is paused or not.\n */\n function paused() public view virtual override returns (bool) {\n return _globalPause.paused();\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/GlobalRestrictableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalBlacklist} from \"../GlobalBlacklist.sol\";\n\n/**\n * @title GlobalRestrictableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit a blacklist state from the specified\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\n * centralized management of a blacklist for all the Ledgity Yield contracts.\n *\n * @dev Security measure:\n * The _globalBlacklist state must be set at initialization time and, for evident\n * security reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalRestrictableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalRestrictableUpgradeable is Initializable {\n /**\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalBlacklist private _globalBlacklist;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n */\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\n __GlobalRestrictable_init_unchained(globalBlacklist_);\n }\n\n function __GlobalRestrictable_init_unchained(\n address globalBlacklist_\n ) internal onlyInitializing {\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\n }\n\n /**\n * @notice Retrieves the address of GlobalBlacklist contract.\n * @return The address of the GlobalBlacklist contract.\n */\n function globalBlacklist() public view returns (address) {\n return address(_globalBlacklist);\n }\n\n /**\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\n * @param account Address to verify.\n */\n modifier notBlacklisted(address account) {\n require(isBlacklisted(account) == false, \"L9\");\n _;\n }\n\n /**\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\n * @param account Address to verify.\n * @return Whether the account is blacklisted.\n */\n function isBlacklisted(address account) internal view returns (bool) {\n return _globalBlacklist.isBlacklisted(account);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/InvestUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./GlobalOwnableUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"./GlobalPausableUpgradeable.sol\";\nimport {GlobalRestrictableUpgradeable} from \"./GlobalRestrictableUpgradeable.sol\";\nimport \"./base/BaseUpgradeable.sol\";\nimport {RecoverableUpgradeable} from \"../abstracts/RecoverableUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {APRHistory as APRH} from \"../libs/APRHistory.sol\";\nimport {SUD} from \"../libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\n\n/**\n * @title InvestUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts are provided with utilities to manage an invested token,\n * users' investment periods, rewards calculations, virtual balances, and auto-compounding.\n *\n * @dev Intuition:\n * This contract primarily exists for code splitting and reusability. It unburdens the\n * LToken contract code, making it easier to understand and maintain.\n *\n * This contract is generic because it may be used in the LDYStaking contract in the future.\n *\n * @dev Definitions:\n * - Investment: The act of depositing or investing tokens into the contract.\n * - Investment period: Time between the last invested amount change and the present.\n * - Virtual balance: Temporary storage for account rewards, used when those can't be\n * distributed between investment periods.\n * - Rewards redirection: Mechanism allowing an account to redirect its rewards to another.\n *\n * @dev Derived contract must:\n * - Set invested token during initialization\n * - Implement _investmentOf() function\n * - (optionally) Implement _distributeRewards() function\n *\n * @dev For further details, see \"InvestmentUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract InvestUpgradeable is BaseUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n using APRH for APRH.Pack[];\n\n /**\n * @notice Represents an account's investment period.\n * @param timestamp The timestamp of the most recent rewards distribution.\n * @param ref The reference of the last APR checkpoint at that timestamp.\n */\n struct InvestmentPeriod {\n uint40 timestamp; // Supports dates up to 20/02/36812\n APRH.Reference ref;\n }\n\n /**\n * @notice Represents the investment details of an account.\n * @param period The current investment period of the account.\n * @param virtualBalance May hold a part of account rewards until they are claimed.\n */\n struct AccountDetails {\n InvestmentPeriod period;\n uint256 virtualBalance;\n }\n\n /// @notice Holds a reference to the invested token's contract.\n IERC20Upgradeable private _invested;\n\n /// @notice Holds investment details of each account.\n mapping(address => AccountDetails) internal accountsDetails;\n\n /// @notice Holds an history of the APR value over time (see APRHistory.sol).\n APRH.Pack[] private _aprHistory;\n\n /// @notice Holds active rewards redirections in both from->to and to->from[] ways.\n mapping(address => address) public rewardsRedirectsFromTo;\n mapping(address => address[]) public rewardsRedirectsToFrom;\n\n /// @notice Is used to prevent infinite loop in _beforeInvestmentChange().\n bool private _isClaiming;\n\n /**\n * @notice Emitted to inform listeners about a change in the APR's value.\n * @param newAPRUD7x3 The new APR in UD7x3 format.\n */\n event APRChangeEvent(uint16 newAPRUD7x3);\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param invested_ The address of the invested token contract.\n */\n function __Invest_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address invested_\n ) internal onlyInitializing {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n __Invest_init_unchained(invested_);\n }\n\n function __Invest_init_unchained(address invested_) internal onlyInitializing {\n // Set invested token\n _invested = IERC20Upgradeable(invested_);\n\n // Define initial APR to 0%. This would prevent getAPR() from reverting because\n // of an empty APR history\n _aprHistory.setAPR(0);\n }\n\n /**\n * @notice Retrieves the reference to the invested token contract.\n * @return The reference to the invested token contract.\n */\n function invested() public view returns (IERC20Upgradeable) {\n return _invested;\n }\n\n /**\n * @notice Updates the investment APR. Restricted to owner.\n * @param aprUD7x3 The new APR in UD7x3 format.\n */\n function setAPR(uint16 aprUD7x3) public onlyOwner {\n _aprHistory.setAPR(aprUD7x3);\n emit APRChangeEvent(aprUD7x3);\n }\n\n /**\n * @notice Retrieves the most recently set APR.\n * @return The current APR in UD7x3 format.\n */\n function getAPR() public view returns (uint16) {\n return _aprHistory.getAPR();\n }\n\n /**\n * @notice Enables redirection of rewards from one account to another.\n * @param from The address of the account to redirect rewards from.\n * @param to The address of the account to redirect rewards to.\n */\n function startRewardsRedirection(\n address from,\n address to\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\n // Ensure the address is not already redirecting rewards\n require(rewardsRedirectsFromTo[from] == address(0), \"L62\");\n\n // Ensure neither 'from' nor 'to' are the zero address\n require(from != address(0), \"L12\");\n require(to != address(0), \"L13\");\n\n // Ensure 'from' and 'to' addresses are distinct\n require(from != to, \"L14\");\n\n // Ensure function caller is either the owner or the 'from' address\n require(_msgSender() == owner() || _msgSender() == from, \"L15\");\n\n // Distribute current rewards and reset investment periods of both accounts\n _beforeInvestmentChange(from, true);\n _beforeInvestmentChange(to, true);\n\n // Activate rewards redirection\n rewardsRedirectsFromTo[from] = to;\n rewardsRedirectsToFrom[to].push(from);\n }\n\n /**\n * @notice Disable an active rewards redirection.\n * @param from The address of the account to stop redirecting rewards from.\n * @param to The address of the account to stop redirecting rewards to.\n */\n function stopRewardsRedirection(\n address from,\n address to\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\n // Ensure neither 'from' nor 'to' are the zero address\n require(from != address(0), \"L16\");\n require(to != address(0), \"L17\");\n\n // Ensure function caller is either the owner or the 'from' address\n require(_msgSender() == owner() || _msgSender() == from, \"L18\");\n\n // Ensure a rewards redirection was active\n require(rewardsRedirectsFromTo[from] == to, \"L19\");\n\n // Distribute current rewards and reset investment periods of both accounts\n _beforeInvestmentChange(from, true);\n _beforeInvestmentChange(to, true);\n\n // Retrieve 'from' index in the redirection array of 'to'\n int256 fromIndex = -1;\n for (uint256 i = 0; i < rewardsRedirectsToFrom[to].length; i++) {\n if (rewardsRedirectsToFrom[to][i] == from) {\n fromIndex = int256(i);\n break;\n }\n }\n\n // fromIndex should never be -1 at this point\n assert(fromIndex >= 0);\n\n // Deactivate rewards redirection\n rewardsRedirectsFromTo[from] = address(0);\n rewardsRedirectsToFrom[to][uint256(fromIndex)] = rewardsRedirectsToFrom[to][\n rewardsRedirectsToFrom[to].length - 1\n ];\n rewardsRedirectsToFrom[to].pop();\n }\n\n /**\n * @notice Retrieves the total amount of tokens invested by the given account.\n * @dev Derived contracts must implement this function.\n * @param account The account to get the investment of.\n * @return The total amount of tokens invested by the given account.\n */\n function _investmentOf(address account) internal view virtual returns (uint256);\n\n /**\n * @notice Distributes a specified amount of rewards to a given account.\n * @dev Derived contracts may optionally implement this function.\n * @dev Implementations must return true to indicate a successful distribution, and\n * false otherwise. If it returns false, the rewards will be added to the account's\n * virtual balance, in order to be claimed later.\n * @param account The account to claim the rewards of.\n * @param amount The amount of rewards to claim.\n * @return Whether the rewards distribution was successfull.\n */\n function _distributeRewards(address account, uint256 amount) internal virtual returns (bool) {\n account; // Silence unused variables warning\n amount;\n return false;\n }\n\n /**\n * @notice Computes the rewards accrued over a specified period of time, based on a\n * given APR and amount of invested tokens.\n * @dev For further details, see \"InvestUpgradeable > Rewards calculation\" section of\n * the whitepaper.\n * @param beginTimestamp The moment the period commenced.\n * @param endTimestamp The moment the period concluded.\n * @param aprUD7x3 The APR during this period, in UD7x3 format.\n * @param investedAmount The amount of tokens deposited/invested during the period.\n * @return The amount of rewards generated during the period.\n */\n function _calculatePeriodRewards(\n uint40 beginTimestamp,\n uint40 endTimestamp,\n uint16 aprUD7x3,\n uint256 investedAmount\n ) internal view returns (uint256) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Compute the number of elapsed years\n uint256 elapsedTimeSUD = SUD.fromInt(endTimestamp - beginTimestamp, d);\n uint256 elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1, d)) / SUD.fromInt(365 days, d);\n\n // Compute the growth in invested amount (thanks to rewards)\n uint256 aprSUD = SUD.fromRate(aprUD7x3, d);\n uint256 growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1, d);\n\n // Compute and return the rewards\n uint256 investedAmountSUD = SUD.fromAmount(investedAmount, d);\n uint256 rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(rewardsSUD, d);\n }\n\n /**\n * @notice Computes the sum of given account's invested amount, plus invested amount\n * of all accounts that recursively redirect rewards to this account.\n * @param account The account to calculate the deep investment of.\n * @return deepInvestedAmount The deep invested amount.\n */\n function _deepInvestmentOf(address account) internal view returns (uint256 deepInvestedAmount) {\n // Consider account's direct investment\n deepInvestedAmount += _investmentOf(account);\n\n // But also the deep investments of all accounts redirecting rewards to this account\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\n deepInvestedAmount += _deepInvestmentOf(rewardsRedirectsToFrom[account][i]);\n }\n }\n\n /**\n * @notice Computes the amount of unclaimed/undistributed rewards of a given account.\n * @dev For further details, see \"InvestUpgradeable > Rewards calculation\" section of\n * the whitepaper.\n * @param account The account to calculate the unclaimed rewards of.\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\n * @return rewards The amount of unclaimed/undistributed rewards of the given account.\n */\n function _rewardsOf(\n address account,\n bool autocompound\n ) internal view returns (uint256 rewards) {\n // Retrieve account's investment details\n AccountDetails memory details = accountsDetails[account];\n\n // Retrieve account's deep invested amount\n uint256 investedAmount = _deepInvestmentOf(account);\n\n // Return 0 if the account has never invested or has no invested amount\n if (details.period.timestamp == 0 || investedAmount == 0) return 0;\n\n // Retrieve reference and data of APR checkpoint at which started investment period\n APRH.Reference memory currRef = details.period.ref;\n APRH.CheckpointData memory currCheckpoint = _aprHistory.getDataFromReference(currRef);\n\n // Retrieve reference of latest APR checkpoint\n APRH.Reference memory latestRef = _aprHistory.getLatestReference();\n\n // 1) Fill rewards with virtual balance (rewards not claimed/distributed yet)\n // See \"InvestUpgradeable > Yield calculation > 1)\" section of the whitepaper\n rewards = details.virtualBalance;\n\n // If start checkpoint is not the latest one\n if (!APRH.eq(currRef, latestRef)) {\n // Retrieve reference and data of APR checkpoint that comes after start checkpoint\n APRH.Reference memory nextRef = APRH.incrementReference(currRef);\n APRH.CheckpointData memory nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\n\n // 2) Calculate rewards from investment period start to next checkpoint\n // See \"InvestUpgradeable > Yield calculation > 2)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n details.period.timestamp,\n nextCheckpoint.timestamp,\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n\n // 3) Calculate rewards for each crossed pair of checkpoints\n // See \"InvestUpgradeable > Yield calculation > 3)\" section of the whitepaper\n while (true) {\n // Set next checkpoint as the current one\n currRef = nextRef;\n currCheckpoint = nextCheckpoint;\n\n // Break if current checkpoint is the latest one\n if (APRH.eq(currRef, latestRef)) break;\n\n // Else, retrieve the new next checkpoint\n nextRef = APRH.incrementReference(currRef);\n nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\n\n // Calculate rewards between the current pair of checkpoints\n rewards += _calculatePeriodRewards(\n currCheckpoint.timestamp,\n nextCheckpoint.timestamp,\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n }\n\n // 4) Calculate rewards from the latest checkpoint to now\n // See \"InvestUpgradeable > Yield calculation > 4)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n currCheckpoint.timestamp,\n uint40(block.timestamp),\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n } else {\n // 2.bis) Calculate rewards from investment period start to now\n // See \"InvestUpgradeable > Yield calculation > 2.bis)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n details.period.timestamp,\n uint40(block.timestamp),\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n }\n }\n\n /**\n * @notice Recursively resets the investment period of the specified account and of\n * all accounts that directly or indirectly redirect rewards to this account.\n * @param account The account to deeply reset the investment period of.\n */\n function _deepResetInvestmentPeriodOf(address account) internal {\n // Reset account investment period timestamp and APR checkpoint to latest ones\n accountsDetails[account].period.timestamp = uint40(block.timestamp);\n accountsDetails[account].period.ref = _aprHistory.getLatestReference();\n\n // Also reset the ones of all accounts that recursively redirect rewards to this account\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\n _deepResetInvestmentPeriodOf(rewardsRedirectsToFrom[account][i]);\n }\n }\n\n /**\n * @notice Hook to be invoked before the invested amount of an account changes. It\n * ensures that rewards are distributed and that account's investment period is reset.\n * @param account The account whose invested amount is going to change.\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\n */\n function _beforeInvestmentChange(address account, bool autocompound) internal {\n // This hook is called inside LToken._beforeTokenTransfer() and as new tokens are\n // minted in LToken._distributeRewards(), this guards against infinite loop.\n if (_isClaiming) return;\n\n // LToken._beforeTokenTransfer() calls this hook for both involved addresses.\n // As first call will treat both addresses, the second call would be redundant.\n // Therefore, we skip accounts already processed in this block to save up some gas.\n if (accountsDetails[account].period.timestamp == uint40(block.timestamp)) return;\n\n // If account redirects its rewards\n address redirectRewardsTo = rewardsRedirectsFromTo[account];\n if (redirectRewardsTo != address(0)) {\n // Call hook on redirection target (this will indirectly reset the investment\n // of this source account) and return\n _beforeInvestmentChange(redirectRewardsTo, autocompound);\n return;\n }\n\n // Else, compute account's undistributed/unclaimed rewards\n uint256 rewards = _rewardsOf(account, autocompound);\n\n // If there are some rewards\n if (rewards > 0) {\n // Try to distribute rewards to account\n _isClaiming = true;\n bool distributed = _distributeRewards(account, rewards);\n _isClaiming = false;\n\n // If rewards have not been distributed, accumulate them in account's virtual balance\n if (!distributed) accountsDetails[account].virtualBalance = rewards;\n }\n\n // Finally, deeply reset investment period of the account\n _deepResetInvestmentPeriodOf(account);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/abstracts/RecoverableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Conracts\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./GlobalOwnableUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title RecoverableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts are provided with helper functions allowing the recovery of\n * assets accidentally sent to them.\n *\n * @dev Where are utilities Ether, ERC721, etc.?\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\n * in this codebase currently do not implement the necessary functions to receive Ether\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\n *\n * @dev For further details, see \"RecoverableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\n __GlobalOwnable_init(globalOwner_);\n __Recoverable_init_unchained();\n }\n\n function __Recoverable_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Recovers a specified amount of a given token address. Will fail if the\n * contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\n // Ensure the specified amount is not zero\n require(amount > 0, \"L10\");\n\n // Create a reference to token's contract\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\n\n // Ensure there is enough token to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L11\");\n\n // Transfer the recovered token amount to the sender\n tokenContract.safeTransfer(_msgSender(), amount);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" + }, + "contracts/src/GlobalBlacklist.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalBlacklist\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\n * Ledgity Yield codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\n * and getter functions to easily check against this global blacklist.\n *\n * @dev For further details, see \"GlobalBlacklist\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Mapping of accounts to their blacklist status.\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\n */\n mapping(address => bool) private _list;\n\n /// @dev Emitted when `account` is blacklisted.\n event Blacklisted(address account);\n\n /// @dev Emitted when `account` is unblacklisted.\n event Unblacklisted(address account);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Adds a given account to the blacklist.\n * @param account The account's address to be blacklisted.\n */\n function blacklist(address account) external onlyOwner {\n require(account != address(0), \"L20\");\n _list[account] = true;\n emit Blacklisted(account);\n }\n\n /**\n * @notice Removes a given account from the blacklist.\n * @param account The account's address to be un-blacklisted.\n */\n function unBlacklist(address account) external onlyOwner {\n _list[account] = false;\n emit Unblacklisted(account);\n }\n\n /**\n * @notice Checks whether a given account is blacklisted.\n * @param account Address of the account to check.\n * @return 'true' if the account is blacklisted, 'false' otherwise\n */\n function isBlacklisted(address account) external view returns (bool) {\n // Gas optimization: Avoid accessing storage if account is the zero address\n // (e.g, during a mint or a burn of tokens)\n if (account == address(0)) return false;\n\n // Else, return current account's blacklist status\n return _list[account];\n }\n}\n" + }, + "contracts/src/GlobalOwner.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {Ownable2StepUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\n/**\n * @title GlobalOwner\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds the address of a global owner account shared by all contracts of the\n * Ledgity Yield's codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\n * owner() function that retrieves the owner's address from this contract instead.\n *\n * @dev For further details, see \"GlobalOwner\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize() public initializer {\n __Ownable2Step_init();\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n}\n" + }, + "contracts/src/GlobalPause.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalPause\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\n * codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\n * paused() function that retrieves the pause state from this contract instead.\n *\n * @dev For further details, see \"GlobalPause\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalPause is\n Initializable,\n UUPSUpgradeable,\n GlobalOwnableUpgradeable,\n PausableUpgradeable\n{\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __Pausable_init();\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\n * but restricted to contract's owner.\n */\n function pause() public onlyOwner {\n _pause();\n }\n\n function unpause() public onlyOwner {\n _unpause();\n }\n}\n" + }, + "contracts/src/interfaces/ITransfersListener.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\ninterface ITransfersListener {\n function onLTokenTransfer(address from, address to, uint256 amount) external;\n}\n" + }, + "contracts/src/LDYStaking.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ReentrancyGuardUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport {BaseUpgradeable} from \"./abstracts/base/BaseUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title LDYStaking\n * @custom:security-contact security@ledgity.com\n *\n * @dev This contract implements tierOf() function from LDYStaking as it's the only\n * one the LToken contract relies on.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDYStaking is BaseUpgradeable, ReentrancyGuardUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /**\n * @notice Represents a user staking info in array.\n * @param stakedAmount Amount of the stake.\n * @param unStakeAt Unstake at.\n * @param duration Staking period in seconds.\n * @param rewardPerTokenPaid Reward per token paid.\n * @param rewards Rewards to be claimed.\n */\n struct StakingInfo {\n uint256 stakedAmount;\n uint256 unStakeAt;\n uint256 duration;\n uint256 rewardPerTokenPaid;\n uint256 rewards;\n }\n\n /// @notice Stake and Reward token.\n IERC20Upgradeable public stakeRewardToken;\n\n /// @notice Minimal stake duration for perks.\n uint256 public stakeDurationForPerks;\n\n /// @notice Minimal stake amount for perks.\n uint256 public stakeAmountForPerks;\n\n /// @notice Stake durations.\n uint256[] public stakeDurations;\n\n /// @notice Duration of the rewards (in seconds).\n uint256 public rewardsDuration;\n\n /// @notice Timestamp of when the rewards finish.\n uint256 public finishAt;\n\n /// @notice Timestamp of the reward updated.\n uint256 public lastUpdateTime;\n\n /// @notice Reward per second(total rewards / duration).\n uint256 public rewardRatePerSec;\n\n /// @notice Reward per token stored, sum of (reward rate * dt * 1e18 / total supply).\n uint256 public rewardPerTokenStored;\n\n /// @notice Total staked amounts.\n uint256 public totalStaked;\n\n /// @notice User stakingInfo map, user address => array of the staking info\n mapping(address => StakingInfo[]) public userStakingInfo;\n\n /**\n * @notice Emitted when users stake token\n * @param user User address\n * @param stakeIndex Latest index of user staking pool\n * @param amount Staked amount\n */\n event Staked(address indexed user, uint256 stakeIndex, uint256 amount);\n\n /**\n * @notice Emitted when users unstake token\n * @param user User address\n * @param stakeIndex User staking pool index\n * @param amount Staked amount\n */\n event Unstaked(address indexed user, uint256 stakeIndex, uint256 amount);\n\n /**\n * @notice Emitted when users claim rewards\n * @param user User address\n * @param stakeIndex User staking pool index\n * @param reward Reward token amount\n */\n event RewardPaid(address indexed user, uint256 stakeIndex, uint256 reward);\n\n /**\n * @notice Emitted when admin add rewards.\n * @param rewardAmount Reward amount added by admin.\n * @param rewardPerSec RewardRatePerSec updated.\n */\n event NotifiedRewardAmount(uint256 rewardAmount, uint256 rewardPerSec);\n\n /**\n * @notice Holds a mapping of addresses that default to the highest staking tier.\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\n */\n mapping(address => bool) public highTierAccounts;\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once.\n * @dev This function is intended for setting initial values for the contract's state variables.\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param stakeRewardToken_ The address of stake and reward token(LDY token).\n * @param stakeDurations_ Available Staking Durations.\n * @param stakeDurationForPerks_ Minimal staking duration for perks.\n * @param stakeAmountForPerks_ Minimal staking amount for perks.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address stakeRewardToken_,\n uint256[] memory stakeDurations_,\n uint256 stakeDurationForPerks_,\n uint256 stakeAmountForPerks_\n ) public initializer {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n stakeRewardToken = IERC20Upgradeable(stakeRewardToken_);\n stakeDurations = stakeDurations_;\n stakeDurationForPerks = stakeDurationForPerks_;\n stakeAmountForPerks = stakeAmountForPerks_;\n }\n\n // --------------------\n // MUTATIVE FUNCTIONS\n // --------------------\n\n /**\n * @notice Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards.\n * @dev Emits a `Staked` event upon successful staking.\n * @param amount The amount of tokens to stake.\n * @param stakeDurationIndex The Index of stakeDurations array.\n */\n function stake(\n uint256 amount,\n uint8 stakeDurationIndex\n ) external nonReentrant whenNotPaused notBlacklisted(_msgSender()) {\n require(amount > 0, \"amount = 0\");\n require(stakeDurationIndex <= stakeDurations.length - 1, \"invalid staking period\");\n\n _updateReward(address(0), 0);\n uint256 stakeDuration = stakeDurations[stakeDurationIndex];\n StakingInfo memory stakingInfo = StakingInfo({\n stakedAmount: amount,\n unStakeAt: block.timestamp + stakeDuration,\n duration: stakeDuration,\n rewardPerTokenPaid: rewardPerTokenStored,\n rewards: 0\n });\n\n // check whether account is eligible for benefit from the protocol\n if (stakeDuration >= stakeDurationForPerks && amount >= stakeAmountForPerks) {\n highTierAccounts[_msgSender()] = true;\n }\n\n userStakingInfo[_msgSender()].push(stakingInfo);\n\n uint256 stakeIndex = userStakingInfo[_msgSender()].length - 1;\n totalStaked += amount;\n\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\n\n emit Staked(_msgSender(), stakeIndex, amount);\n }\n\n /**\n * @notice Withdraw staked tokens after stakeDuration has passed.\n * @dev Emits a `Unstaked` event upon successful withdrawal.\n * On full withdrawal, userStakingInfo removes stake pool for stakeIndex.\n * @param amount The amount of tokens to withdraw.\n * @param stakeIndex The index of user staking pool\n */\n function unstake(\n uint256 amount,\n uint256 stakeIndex\n ) external nonReentrant notBlacklisted(_msgSender()) {\n require(amount > 0, \"amount = 0\");\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \"invalid stakeIndex\");\n require(\n block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt,\n \"not allowed unstaking in the staking period\"\n );\n require(\n amount <= userStakingInfo[_msgSender()][stakeIndex].stakedAmount,\n \"insufficient amount\"\n );\n\n _updateReward(_msgSender(), stakeIndex);\n totalStaked -= amount;\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount -= amount;\n\n // check whether account is eligible for benefit from the protocol\n if (\n userStakingInfo[_msgSender()][stakeIndex].duration >= stakeDurationForPerks &&\n userStakingInfo[_msgSender()][stakeIndex].stakedAmount < stakeAmountForPerks\n ) {\n highTierAccounts[_msgSender()] = false;\n }\n\n // remove staking info from array on full withdrawal\n if (userStakingInfo[_msgSender()][stakeIndex].stakedAmount == 0) {\n _claimReward(_msgSender(), stakeIndex);\n\n userStakingInfo[_msgSender()][stakeIndex] = userStakingInfo[_msgSender()][\n userStakingInfo[_msgSender()].length - 1\n ];\n userStakingInfo[_msgSender()].pop();\n }\n stakeRewardToken.safeTransfer(_msgSender(), amount);\n\n emit Unstaked(_msgSender(), stakeIndex, amount);\n }\n\n /**\n * @notice Claim pending rewards.\n * @dev Emits a `RewardPaid` event upon successful reward claim.\n * @param stakeIndex The index of user staking pool.\n */\n function getReward(uint256 stakeIndex) external nonReentrant notBlacklisted(_msgSender()) {\n require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, \"invalid stakeIndex\");\n _updateReward(_msgSender(), stakeIndex);\n _claimReward(_msgSender(), stakeIndex);\n }\n\n // --------------------\n // ADMIN CONFIGURATION\n // --------------------\n\n /**\n * @notice Update Rewards Duration.\n * @dev Only callable by owner, and setting available only after rewards period.\n * @param duration The nmew rewards duration in seconds.\n */\n function setRewardsDuration(uint256 duration) external onlyOwner {\n require(finishAt < block.timestamp, \"reward duration is not finished\");\n rewardsDuration = duration;\n }\n\n /**\n * @notice Notify the contract about the amount of rewards to be distributed and update reward parameters.\n * @dev Only callable by owner.\n * @param amount The amount of reward to be distributed.\n */\n function notifyRewardAmount(uint256 amount) external onlyOwner {\n require(rewardsDuration > 0, \"rewards duration is not set\");\n require(amount > 0, \"amount = 0\");\n\n _updateReward(address(0), 0);\n\n if (block.timestamp >= finishAt) {\n rewardRatePerSec = amount / rewardsDuration;\n } else {\n uint256 remainingRewards = (finishAt - block.timestamp) * rewardRatePerSec;\n rewardRatePerSec = (amount + remainingRewards) / rewardsDuration;\n }\n\n require(rewardRatePerSec > 0, \"reward rate = 0\");\n require(\n rewardRatePerSec <=\n (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) /\n rewardsDuration,\n \"reward amount > balance\"\n );\n\n finishAt = block.timestamp + rewardsDuration;\n lastUpdateTime = block.timestamp;\n\n stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount);\n\n emit NotifiedRewardAmount(amount, rewardRatePerSec);\n }\n\n // --------------------\n // VIEW FUNCTIONS\n // --------------------\n\n /**\n * @notice Get the last time when rewards were applicable for the specified reward token.\n * @return Timestamp of the most recent rewards calculation.\n */\n function lastTimeRewardApplicable() public view returns (uint256) {\n return _min(finishAt, block.timestamp);\n }\n\n /**\n * @notice Calculate the reward per token for a given reward token.\n * @return Current reward per token.\n */\n function rewardPerToken() public view returns (uint256) {\n if (totalStaked == 0) {\n return rewardPerTokenStored;\n }\n\n return\n rewardPerTokenStored +\n (rewardRatePerSec * (lastTimeRewardApplicable() - lastUpdateTime) * 1e18) /\n totalStaked;\n }\n\n /**\n * @notice Calculate the user's stake pool earnings\n * @param account Address of the user.\n * @param stakeIndex Index of the stakePool\n * @return Return earned amounts\n */\n function earned(address account, uint256 stakeIndex) public view returns (uint256) {\n StakingInfo memory userInfo = userStakingInfo[account][stakeIndex];\n uint256 rewardsSinceLastUpdate = ((userInfo.stakedAmount *\n (rewardPerToken() - userInfo.rewardPerTokenPaid)) / 1e18);\n return rewardsSinceLastUpdate + userInfo.rewards;\n }\n\n /**\n * @notice Get the earned rewards array for a user.\n * @param account Address of the user.\n * @return Return earned rewards array for a user.\n */\n function getEarnedUser(address account) public view returns (uint256[] memory) {\n uint256 numberOfPools = userStakingInfo[account].length;\n uint256[] memory earnedArray = new uint256[](numberOfPools);\n for (uint256 index; index < numberOfPools; index++) {\n earnedArray[index] = earned(account, index);\n }\n return earnedArray;\n }\n\n /**\n * @dev tierOf() function that always return that the given account is not\n * elligible to any LDY staking tier, except if the account is in the\n * highTierAccounts mapping.\n * @param account The account to check the tier of.\n */\n function tierOf(address account) public view returns (uint256 tier) {\n if (highTierAccounts[account]) return 3;\n return 0;\n }\n\n /**\n * @notice Get User Stake Data.\n * @param account The address of user.\n * @return StakingInfo array.\n */\n function getUserStakes(address account) external view returns (StakingInfo[] memory) {\n return userStakingInfo[account];\n }\n\n /**\n * @notice Send rewards to user.\n * @dev This is private function, called by getReward function.\n * @param account The address of user.\n * @param stakeIndex The index of user staking pool.\n */\n function _claimReward(address account, uint256 stakeIndex) private {\n uint256 reward = userStakingInfo[account][stakeIndex].rewards;\n\n if (reward > 0) {\n userStakingInfo[account][stakeIndex].rewards = 0;\n stakeRewardToken.safeTransfer(account, reward);\n emit RewardPaid(account, stakeIndex, reward);\n }\n }\n\n /**\n * @notice Calculate and update user rewards per stakeIndex.\n * @dev this is private function, called by stake, unstake, getRewards, and notifyRewardAmount functions.\n * @param account The address of user.\n * @param stakeIndex The index of user staking pool.\n */\n function _updateReward(address account, uint256 stakeIndex) private {\n rewardPerTokenStored = rewardPerToken();\n lastUpdateTime = lastTimeRewardApplicable();\n\n if (account != address(0)) {\n userStakingInfo[account][stakeIndex].rewards = earned(account, stakeIndex);\n userStakingInfo[account][stakeIndex].rewardPerTokenPaid = rewardPerTokenStored;\n }\n }\n\n /**\n * @notice Take minimum value between x and y.\n */\n function _min(uint256 x, uint256 y) private pure returns (uint256) {\n return x <= y ? x : y;\n }\n}\n" + }, + "contracts/src/libs/APRHistory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n/**\n * @title APRHistory\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This library offers utilities to efficiently maintain the history of an\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\n * a \"checkpoint\".\n *\n * @dev Intuition:\n * Each checkpoint in an APR history consists of two data:\n * - the creation timestamp\n * - the APR at that time\n *\n * Given that reading and writing to storage slots are among the most costly operations\n * in Solidity, this library provides a way to store those data in a way that minimizes\n * the number of used storage slots.\n *\n * Instead of storing each checkpoint in a separate storage slot, this library\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\n *\n * @dev Definitions:\n * - Checkpoint: A record of an APR change\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\n * - History: A dynamic array of packs\n * - Reference: A storage pointer to a checkpoint in the APR history\n * - CheckpointData: An in-memory representation of a checkpoint data\n *\n * @dev Value limitation:\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\n * APR in LToken contract, which is expected to remain below 10%.\n *\n * @dev For further details, see \"APRHistory\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary APRHistory {\n /**\n * @notice Represents data of a checkpoint extracted from the on-chain history.\n * For on-chain representation see \"Pack\" struct.\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\n * @param timestamp Timestamp of the checkpoint's creation.\n */\n struct CheckpointData {\n uint16 aprUD7x3; // Allows up to 65.536%\n uint40 timestamp; // Supports dates up to 20/02/36812\n }\n\n /**\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\n * @param aprsUD7x3 Array of checkpoints' APRs.\n * @param timestamps Array of checkpoints' timestamps.\n * @param cursor Index of the next checkpoint to be written.\n */\n struct Pack {\n uint16[4] aprsUD7x3;\n uint40[4] timestamps;\n uint32 cursor;\n }\n\n /**\n * @notice Represents a storage pointer to a specific checkpoint in the history.\n * @param packIndex Index of the pack the checkpoint belongs to.\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\n */\n struct Reference {\n uint256 packIndex;\n uint32 cursorIndex;\n }\n\n /**\n * @notice Compares two checkpoints references.\n * @param ref1 The first reference to compare.\n * @param ref2 The second reference to compare.\n * @return Whether the two references points to the same checkpoint.\n */\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\n }\n\n /**\n * @notice Returns the reference of the checkpoint that should come right after the\n * referenced checkpoint in the APR history.\n * @param ref The reference to be incremented.\n * @return The incremented reference.\n */\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L1\");\n\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\n //\n // Else, return ref of next slot in current pack\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\n }\n\n /**\n * @notice Extracts checkpoint data from a given reference and in APR history.\n * @param self The APR history to extract the checkpoint from.\n * @param ref The reference of the checkpoint data to extract.\n * @return The extracted checkpoint's data.\n */\n function getDataFromReference(\n Pack[] storage self,\n Reference memory ref\n ) public view returns (CheckpointData memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L2\");\n\n // Ensure pack index of the given ref exists in history\n require(ref.packIndex < self.length, \"L3\");\n\n // Retrieve pack data from history\n Pack memory pack = self[ref.packIndex];\n\n // Ensure cursor index of the given ref has been written\n require(ref.cursorIndex < pack.cursor, \"L4\");\n\n // Build and return the checkpoint data\n return\n CheckpointData({\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\n timestamp: pack.timestamps[ref.cursorIndex]\n });\n }\n\n /**\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\n * @param self The history to extract the reference from.\n * @return The reference of the latest checkpoint.\n */\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\n // Ensure the given history is not empty\n require(self.length != 0, \"L5\");\n\n // Retrieve latest pack's index and cursor\n uint256 packIndex = self.length - 1;\n uint32 packCursor = self[packIndex].cursor;\n\n // If this is the first pack ever, ensure it is not empty\n if (packIndex == 0) require(packCursor != 0, \"L6\");\n\n // If the pack is empty, return ref of previous pack's latest slot\n if (packCursor == 0) return Reference(packIndex - 1, 3);\n //\n // Else, return ref of previous slot in current pack\n else return Reference(packIndex, packCursor - 1);\n }\n\n /**\n * @notice Appends a new empty pack to the end of the given APR history array.\n * @param self The APR history to append an empty to.\n */\n function newBlankPack(Pack[] storage self) internal {\n // If history is not empty, ensure the latest pack is full\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \"L7\");\n\n // Push a new blank pack to the history array\n self.push(\n Pack({\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\n cursor: 0\n })\n );\n }\n\n /**\n * @notice Write a new APR checkpoint at the end of the given history array.\n * @param self The array of packs to write the new checkpoint to.\n * @param aprUD7x3 The new APR in UD7x3 format.\n */\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\n // Determine the reference where the new checkpoint should be written\n Reference memory newRef = self.length == 0\n ? Reference(0, 0)\n : incrementReference(getLatestReference(self));\n\n // If pack to be written doesn't exist yet, push a new blank pack in history\n if (newRef.packIndex >= self.length) newBlankPack(self);\n\n // Retrieve the pack where the new checkpoint will be stored\n Pack memory pack = self[newRef.packIndex];\n\n // Add new checkpoint's data to the pack\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\n\n // Increment the pack's cursor\n pack.cursor++;\n\n // Write the updated pack in storage\n self[newRef.packIndex] = pack;\n }\n\n /**\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\n * @param self The history array to read APR from.\n * @return The latest checkpoint's APR.\n */\n function getAPR(Pack[] storage self) public view returns (uint16) {\n // Retrieve the latest checkpoint data\n Reference memory ref = getLatestReference(self);\n CheckpointData memory data = getDataFromReference(self, ref);\n\n // Return the latest checkpoint's APR\n return data.aprUD7x3;\n }\n}\n" + }, + "contracts/src/libs/SUD.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\n\n/**\n * @title SUD\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice SUD serves as an intermediary number format for calculations within this\n * codebase. It ensures consistency and reduces precision losses. This library\n * facilitates conversions between various number formats and the SUD format.\n *\n * @dev Intuition:\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\n * represent both percentage rates and tokens amounts.\n *\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\n * the decimals() value of the involved tokens.\n *\n * Three challenges arise from this:\n * 1) To compute values together, it's essential that they are in the same format\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\n * precision loss (because division shrinks). A common approach is to scale up and\n * down values by a few decimals before and after performing calculations.\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\n * be shrunk in case token's decimals number is in [0, 2].\n *\n * To address these challenges, this library provides the SUD format, which acts as a\n * consistent and scaled intermediate format to perform calculations.\n *\n * SUD is an acronym for either \"Scaled UD\" or \"Safe UD\".\n *\n * @dev Definitions:\n * - Integer: A number without fractional part, e.g., block.timestamp\n * - UD: A decimal unsigned fixed-point number. The \"UD\" notation is inspired from\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\n * and fractional parts (as token amounts have variable decimal numbers)\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\n * with 3 more decimals than the involved UD with the highest decimals number. As\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\n * so ranges from UD71x6 to UD0x77 formats.\n *\n * @dev A conversion library:\n * This library provides utilities to perform the following conversions:\n * - Amount <--> SUD\n * - Rate (UD7x3) <--> SUD\n * - Integer <--> SUD\n *\n * @dev Why scaling by 3 decimals?\n * - It provides an adequate degree of precision for this codebase,\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\n * the involved token's decimal number, so is gas efficient.\n *\n * @dev Why internal functions?\n * The functions of this library are not set to external because incorporating them\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\n * from making them external are negated by the additional bytecode required for external\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\n * when those functions's visibility is set to external or internal.\n *\n * @dev Precision warning:\n * While this library mitigates precision loss during calculations on UD numbers, it's\n * important to note that tokens with lower decimal counts and supply inherently suffer\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\n * will experience less precision loss.\n *\n * @dev For further details, see \"SUD\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary SUD {\n /**\n * @notice Retrieves decimals number of the given ERC20 contract address.\n * @param tokenAddress The address to retrieve decimals number from.\n * @return decimals The decimals number of the given ERC20 contract address.\n */\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\n }\n\n /**\n * @notice Convert a given token amount into SUD format.\n * @param nAmount The token amount to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The amount in SUD format\n */\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\n\n // Else return a number with decimals+3 fractional digits\n return nAmount * 10 ** 3;\n }\n\n /**\n * @notice Convert a given SUD number into token amount format.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nAmount The number in amount format\n */\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** 3;\n }\n\n /**\n * @notice Converts a given UD7x3 rate into SUD format.\n * @param nUD7x3 The UD7x3 rate to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The rate in SUD format.\n */\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nUD7x3 * 10 ** 3;\n\n // Else, return a number with decimals+3 fractional digits\n return nUD7x3 * 10 ** decimals;\n }\n\n /**\n * @notice Converts a given SUD number into a UD7x3 rate.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nUD7x3 The number in UD7x3 rate format.\n */\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 3;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** decimals;\n }\n\n /**\n * @notice Converts a given integer into SUD format.\n * @param n The integer to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The integer in SUD format.\n */\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return n * 10 ** 6;\n\n // Else, return a number with decimals+3 fractional digits\n return n * 10 ** (decimals + 3);\n }\n\n /**\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return n The SUD number as an integer.\n */\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 6;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** (decimals + 3);\n }\n}\n" + }, + "contracts/src/LToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ERC20WrapperUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\";\nimport \"./abstracts/base/ERC20BaseUpgradeable.sol\";\nimport {InvestUpgradeable} from \"./abstracts/InvestUpgradeable.sol\";\nimport {LDYStaking} from \"./LDYStaking.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {SUD} from \"./libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\nimport {ITransfersListener} from \"./interfaces/ITransfersListener.sol\";\n\n/**\n * @title LToken\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\n * the form of additional L-Tokens, which are auto-compounded over time.\n *\n * @dev Definitions:\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\n * - Instant: Processed immediately.\n * - Request: Queued for later processing.\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\n * - Request ID: The index of a withdrawal request in the queue array.\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\n * expected ways and are so considered safe to use by the contract.\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\n * processing.\n *\n * Note that words between parenthesis are sometimes omitted for brevity.\n *\n * @dev Deployment notice:\n * This contract can safely receive funds immediately after initialization. (i.e., there\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\n * replace ASAP owner and fund wallets with multi-sig wallets.\n *\n * @dev For further details, see \"LToken\" section of whitepaper.\n * @custom:oz-upgrades-unsafe-allow external-library-linking\n * @custom:security-contact security@ledgity.com\n */\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /// @dev Represents type of actions triggering ActivityEvent events.\n enum Action {\n Deposit,\n Withdraw\n }\n\n /// @dev Represents different status of actions triggering ActivityEvent events.\n enum Status {\n Queued,\n Cancelled,\n Success,\n Moved\n }\n\n /**\n * @notice Represents a withdrawal request in the queue.\n * @dev A request fits in a single storage slot (32 bytes).\n * @param account The account that initiated the request.\n * @param amount The amount of underlying tokens requested.\n */\n struct WithdrawalRequest {\n address account; // 20 bytes\n uint96 amount; // 12 bytes\n }\n\n /// @notice Upper limit of retention rate.\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\n\n /// @notice Upper limit of fees rate.\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\n\n /// @notice Used in activity events to represent the absence of request ID.\n int256 private constant NO_ID = -1;\n\n /// @notice Holds a reference to the LDYStaking contract.\n LDYStaking public ldyStaking;\n\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\n address payable public withdrawer;\n\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\n address public fund;\n\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\n uint32 public feesRateUD7x3;\n\n /// @notice Holds the retention rate in UD7x3 format.\n uint32 public retentionRateUD7x3;\n\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\n uint256 public unclaimedFees;\n\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\n uint256 public totalQueued;\n\n /**\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\n */\n uint256 public usableUnderlyings;\n\n /// @notice Holds an ordered list of active withdrawal requests.\n WithdrawalRequest[] public withdrawalQueue;\n\n /// @notice Holds the index of the next withdrawal request to process in the queue.\n uint256 public withdrawalQueueCursor;\n\n /**\n * @notice Holds a list of all currently frozen withdrawal requests.\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\n * it from blocking the queue.\n */\n WithdrawalRequest[] public frozenRequests;\n\n /**\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\n */\n ITransfersListener[] public transfersListeners;\n\n /**\n * @notice Emitted to inform listeners about a change in the contract's TVL.\n * @dev TVL = realTotalSupply()\n * @param newTVL The new TVL of the contract.\n */\n event TVLChangeEvent(uint256 newTVL);\n\n /**\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\n * @param account The account involved in the activity.\n * @param action The type of activity.\n * @param amount The amount of underlying tokens involved in the activity.\n * @param newStatus The new status of the activity.\n * @param newId The new ID of the request if it has been moved in the queue.\n */\n event ActivityEvent(\n int256 indexed id,\n address indexed account,\n Action indexed action,\n uint256 amount,\n uint256 amountAfterFees,\n Status newStatus,\n int256 newId\n );\n\n /**\n * @notice Emitted to inform listeners that some rewards have been minted.\n * @param account The account that received the rewards.\n * @param balanceBefore The balance of the account before the minting.\n * @param rewards The amount of minted rewards.\n */\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\n\n /// @notice Reverts if the function caller is not the withdrawer wallet.\n modifier onlyWithdrawer() {\n require(_msgSender() == withdrawer, \"L39\");\n _;\n }\n\n /// @notice Reverts if the function caller is not the fund wallet.\n modifier onlyFund() {\n require(_msgSender() == fund, \"L40\");\n _;\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address ldyStaking_,\n address underlyingToken\n ) public initializer {\n // Initialize ERC20 base.\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\n __ERC20Base_init(\n globalOwner_,\n globalPause_,\n globalBlacklist_,\n string(abi.encodePacked(\"Ledgity \", underlyingSymbol)),\n string(abi.encodePacked(\"L\", underlyingSymbol))\n );\n\n // IMPORTANT: Below calls must not be restricted to owner at any point.\n // This is because the GlobalOwner contract may not be a fresh one, and so\n // the contract deployer may not be the owner anymore after ERC20Base init.\n\n // Initialize other parents contracts.\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\n __Invest_init_unchained(address(this));\n\n // Set LDYStaking contract\n ldyStaking = LDYStaking(ldyStaking_);\n\n // Set initial withdrawal fees rate to 0.3%\n feesRateUD7x3 = 300;\n\n // Set initial retention rate to 10%\n retentionRateUD7x3 = 10_000;\n\n // Default withdrawer and fund wallet to contract owner address. This prevents\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\n withdrawer = payable(owner());\n fund = payable(owner());\n }\n\n /**\n * @notice Required override of decimals() which is implemented by both\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\n * decimals amount of the underlying stablecoin token.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function decimals()\n public\n view\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\n returns (uint8)\n {\n return ERC20WrapperUpgradeable.decimals();\n }\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @notice Updates the current withdrawal fee rate.\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\n */\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \"L88\");\n feesRateUD7x3 = feesRateUD7x3_;\n }\n\n /**\n * @notice Updates the current underlying token retention rate.\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\n * deposited assets will ever be exposed in this contract (reduces attack surface).\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\n */\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \"L41\");\n retentionRateUD7x3 = retentionRateUD7x3_;\n }\n\n /**\n * @notice Updates the address of LDYStaking contract.\n * @param ldyStakingAddress The address of the new LDYStaking contract.\n */\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\n ldyStaking = LDYStaking(ldyStakingAddress);\n }\n\n /**\n * @notice Updates the address of the withdrawer wallet.\n * @param withdrawer_ The address of the new withdrawer wallet.\n */\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\n // Ensure address is not the zero address (pre-processing fees would be lost else)\n require(withdrawer_ != address(0), \"L63\");\n\n // Set new withdrawer wallet's address\n withdrawer = withdrawer_;\n }\n\n /**\n * @notice Updates the address of the fund wallet.\n * @param fund_ The address of the new fund wallet.\n */\n function setFund(address payable fund_) public onlyOwner {\n // Ensure address is not the zero address (deposited tokens would be lost else)\n require(fund_ != address(0), \"L64\");\n\n // Set new fund wallet's address\n fund = fund_;\n }\n\n /**\n * @notice Adds a new contract to the L-Token transfers list.\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\n * specified contract will be called.\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\n * contracts that are not owned by the Ledgity team.\n * @param listenerContract The address of the new transfers listener contract.\n */\n function listenToTransfers(address listenerContract) public onlyOwner {\n transfersListeners.push(ITransfersListener(listenerContract));\n }\n\n /**\n * @notice Removes a contract from the L-Token transfers list.\n * @dev The onLTokenTransfer() function of the specified contract will not be called\n * anymore each time a L-Token transfer occurs.\n * @param listenerContract The address of the listener contract.\n */\n function unlistenToTransfers(address listenerContract) public onlyOwner {\n // Find index of listener contract in transferListeners array\n int256 index = -1;\n uint256 transfersListenersLength = transfersListeners.length;\n for (uint256 i = 0; i < transfersListenersLength; i++) {\n if (address(transfersListeners[i]) == listenerContract) {\n index = int256(i);\n break;\n }\n }\n\n // Revert if given contract wasn't listening to transfers\n require(index > -1, \"L42\");\n\n // Else, remove transfers listener contract from listeners array\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\n transfersListeners.pop();\n }\n\n /**\n * @notice Retrieves the amount of given account's not yet minted rewards.\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\n * context of LToken, this function returns the amount of rewards that have not been\n * distributed/minted yet to the specified account.\n * @dev This is particularly useful for off-chain services to display charts and\n * statistics, as seen in the Ledgity Yield's frontend.\n * @param account The account to check the unminted rewards of.\n * @return The amount of account's unminted rewards.\n */\n function unmintedRewardsOf(address account) public view returns (uint256) {\n return _rewardsOf(account, true);\n }\n\n /**\n * @notice Retrieves the \"real\" balance of an account, i.e., excluding its not yet\n * minted/distributed rewards.\n * @param account The account to check the real balance of.\n * @return The real balance of the account.\n */\n function realBalanceOf(address account) public view returns (uint256) {\n return super.balanceOf(account);\n }\n\n /**\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\n * not been yet minted to the specified account.\n * @param account The account to check the total balance of.\n * @return The total balance of the account.\n */\n function balanceOf(address account) public view override returns (uint256) {\n return realBalanceOf(account) + unmintedRewardsOf(account);\n }\n\n /**\n * @notice Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\n * @return The real total supply of L-Tokens.\n */\n function realTotalSupply() public view returns (uint256) {\n return super.totalSupply();\n }\n\n /**\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\n * fees and L-Tokens currently in the withdrawal queue.\n * @return The total supply of L-Tokens.\n */\n function totalSupply() public view override returns (uint256) {\n return realTotalSupply() + totalQueued + unclaimedFees;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address.\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\n * token from being the underlying token.\n * @inheritdoc RecoverableUpgradeable\n */\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\n // Ensure the token is not the underlying token\n require(tokenAddress != address(underlying()), \"L43\");\n\n // Proceed to recovery\n super.recoverERC20(tokenAddress, amount);\n }\n\n /**\n * @notice Recovers underlying tokens accidentally sent to the contract.\n * @dev To prevent owner from being able to drain the contract, this function only\n * allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been\n * sent through fund() or deposit() functions.\n */\n function recoverUnderlying() external onlyOwner {\n // Compute the recoverable amount by taking the difference between the contract's\n // balance and the amount of usable underlying tokens\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\n\n // Revert if there is nothing to recover\n require(recoverableAmount > 0, \"L44\");\n\n // Else, proceed to underlying tokens recovery\n super.recoverERC20(address(underlying()), recoverableAmount);\n }\n\n /**\n * @notice Retrieves the amount of underlying tokens invested by the given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\n * LToken contract, the investment of an account is equal to its real balance.\n * @inheritdoc InvestUpgradeable\n */\n function _investmentOf(address account) internal view override returns (uint256) {\n return realBalanceOf(account);\n }\n\n /**\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract so\n * it can distribute rewards to accounts before each period reset.\n * @dev InvestUpgradeable contract already ensure that amount > 0.\n * @inheritdoc InvestUpgradeable\n */\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\n // Inform listeners of the rewards minting\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\n\n // Mint L-Tokens rewards to account\n _mint(account, amount);\n\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\n return true;\n }\n\n /**\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\n * called each time an account's balance is going to change.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\n * @inheritdoc ERC20BaseUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\n\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\n if (from != address(0)) _beforeInvestmentChange(from, true);\n if (to != address(0)) _beforeInvestmentChange(to, true);\n }\n\n /**\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\n * transfers listeners.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already checked in _beforeTokenTransfer().\n * @inheritdoc ERC20Upgradeable\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\n super._afterTokenTransfer(from, to, amount);\n\n // If some L-Token have been burned/minted, inform listeners of a TVL change\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\n\n // Trigger onLTokenTransfer() functions of all the transfers listeners\n for (uint256 i = 0; i < transfersListeners.length; i++) {\n transfersListeners[i].onLTokenTransfer(from, to, amount);\n }\n }\n\n /**\n * @notice Computes the maximum amount of underlying tokens that should be retained\n * by the contract (based on retention rate).\n * @return amount The expected amount of retained underlying tokens.\n */\n function getExpectedRetained() public view returns (uint256 amount) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert totalSupply and retentionRate to SUD\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\n\n // Compute and return expected retained amount\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(expectedRetainedSUD, d);\n }\n\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\n function _transferExceedingToFund() internal {\n // Retrieve the expected amount retained\n uint256 expectedRetained = getExpectedRetained();\n\n // If usable underlyings are less than or equal to expected retained, return\n if (usableUnderlyings <= expectedRetained) return;\n\n // Else, exceeding amount is equal to difference between those values\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= exceedingAmount;\n\n // Transfer the exceeding amount to the fund wallet\n underlying().safeTransfer(fund, exceedingAmount);\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L45\");\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\n * Use deposit() function instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L46\");\n }\n\n /**\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\n * @param amount The amount of underlying tokens to deposit.\n */\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough underlying tokens to deposit\n require(underlying().balanceOf(_msgSender()) >= amount, \"L47\");\n\n // Update usable underlyings balance accordingly\n usableUnderlyings += amount;\n\n // Inform listeners of the deposit activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Deposit,\n amount,\n amount,\n Status.Success,\n NO_ID\n );\n\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\n super.depositFor(_msgSender(), amount);\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\n * given amount.\n * @param account The account initiating the withdrawal.\n * @param amount The amount of the withdrawal.\n */\n function getWithdrawnAmountAndFees(\n address account,\n uint256 amount\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\n // If the account is eligible to staking tier 2, no fees are applied\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\n\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert amount and fees rate to SUD\n uint256 amountSUD = SUD.fromAmount(amount, d);\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\n\n // Compute fees and withdrawn amount (initial amount minus fees)\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\n fees = SUD.toAmount(feesSUD, d);\n withdrawnAmount = amount - fees;\n }\n\n /**\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\n * enough underlying tokens to cover the withdrawal.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestWithdrawal() function otherwise.\n * @param amount The amount L-Tokens to withdraw.\n */\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L48\");\n\n // Can the contract cover this withdrawal plus all already queued requests?\n bool cond1 = totalQueued + amount <= usableUnderlyings;\n\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\n\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\n if (!(cond1 || cond2)) revert(\"L49\");\n\n // Else, retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\n\n // Increase unclaimed fees amount accordingly\n unclaimedFees += fees;\n\n // Decrease usable underlyings balance accordingly\n usableUnderlyings -= withdrawnAmount;\n\n // Inform listeners of this instant withdrawal activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Withdraw,\n amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Burn withdrawal fees from the account\n _burn(_msgSender(), fees);\n\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\n super.withdrawTo(_msgSender(), withdrawnAmount);\n }\n\n /**\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\n * amount of underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n * @param amount The amount L-Tokens to withdraw.\n */\n function requestWithdrawal(\n uint256 amount\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L53\");\n\n // Ensure the requested amount doesn't overflow uint96\n require(amount <= type(uint96).max, \"L54\");\n\n // Ensure the sender attached the pre-paid processing gas fees\n require(msg.value == 0.003 * 10 ** 18, \"L55\");\n\n // Create withdrawal request data\n WithdrawalRequest memory request = WithdrawalRequest({\n account: _msgSender(),\n amount: uint96(amount)\n });\n\n // Will hold the request ID\n uint256 requestId;\n\n // Append request to the withdrawal queue:\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\n withdrawalQueueCursor--;\n requestId = withdrawalQueueCursor;\n withdrawalQueue[requestId] = request;\n }\n // - At the end else\n else {\n withdrawalQueue.push(request);\n requestId = withdrawalQueue.length - 1;\n }\n\n // Increase total amount queued accordingly\n totalQueued += amount;\n\n // Inform listeners of this new queued withdrawal activity event\n emit ActivityEvent(\n int256(requestId),\n _msgSender(),\n Action.Withdraw,\n amount,\n amount,\n Status.Queued,\n NO_ID\n );\n\n // Burn withdrawal L-Tokens amount from account's balance\n _burn(_msgSender(), amount);\n\n // Forward pre-paid processing gas fees to the withdrawer wallet\n (bool sent, ) = withdrawer.call{value: msg.value}(\"\");\n require(sent, \"L56\");\n }\n\n /**\n * @notice Processes queued withdrawal requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n * @dev For further details, see \"LToken > Withdrawals\" section of whitepaper.\n */\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\n // Accumulators variables, will be written on-chain after the loop\n uint256 cumulatedFees = 0;\n uint256 cumulatedWithdrawnAmount = 0;\n uint256 nextRequestId = withdrawalQueueCursor;\n\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\n // requests are increasing the queue length when moved at the end of the queue.\n uint256 queueLength = withdrawalQueue.length;\n\n // Iterate over requests to be processed\n while (nextRequestId < queueLength) {\n // Stop processing requests if there is not enough gas left to continue the\n // loop and properly end the function call. This prevents an attacker from\n // blocking the withdrawal processing by creating a ton of tiny requests so\n // this function call cannot fit anymore in block gas limit.\n if (gasleft() < 45000) break;\n\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\n\n // Skip empty request (processed big requests or cancelled requests)\n if (request.account == address(0)) {}\n //\n // If account has been blacklisted since request emission\n else if (isBlacklisted(request.account)) {\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request in the frozen requests list\n frozenRequests.push(request);\n }\n //\n // Or if request is a big request, move it at the end of the queue for now.\n // This request will be processed manually later using processBigQueuedRequest()\n else if (request.amount > getExpectedRetained() / 2) {\n // Inform listeners of this queued request being moved at the end of the queue\n emit ActivityEvent(\n int256(nextRequestId),\n _msgSender(),\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Moved,\n int256(withdrawalQueue.length)\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request at the end of the queue\n withdrawalQueue.push(request);\n }\n //\n // Else, continue request processing\n else {\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Break if the contract doesn't hold enough funds to cover the request\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\n\n // Accumulate fees and withdrawn amount\n cumulatedFees += fees;\n cumulatedWithdrawnAmount += withdrawnAmount;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(nextRequestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Transfer underlying tokens to account. Burning L-Tokens is not required\n // as equestWithdrawal() already did it.\n // Security note: Re-entrancy warning are disabled as the request has\n // just been deleted from the queue, it will so be skipped if trying to\n // process it again.\n // slither-disable-next-line reentrancy-no-eth\n underlying().safeTransfer(request.account, withdrawnAmount);\n }\n\n // Increment next request ID\n nextRequestId++;\n }\n\n // Increase unclaimed fees by the amount of cumulated fees\n unclaimedFees += cumulatedFees;\n\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\n usableUnderlyings -= cumulatedWithdrawnAmount;\n\n // Decrease total amount queued by the cumulated amount requested\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\n\n // Update new queue cursor\n withdrawalQueueCursor = nextRequestId;\n\n // Retention rate cannot exceeds as the withdrawal decreases both usable\n // underlyings and expected retained amounts by the same number and as the\n // expected retained amount is a subset of usable underlyings amount.\n }\n\n /**\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\n * the retention rate).\n * @dev In contrast to non-big requests processing, this function will uses to fund\n * wallet's balance to fill the request. This allows processing requests that are\n * greater than retention rate without having to exceed this rate on the contract.\n * @param requestId The ID of the big request to process.\n */\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure the request is active\n require(request.account != address(0), \"L66\");\n\n // Ensure the request emitter has not been blacklisted since request emission\n require(!isBlacklisted(request.account), \"L50\");\n\n // Ensure this is indeed a big request\n require(request.amount > getExpectedRetained() / 2, \"L51\");\n\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\n uint256 fundBalance = underlying().balanceOf(fund);\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \"L52\");\n\n // Increase amount of unclaimed fees accordingly\n unclaimedFees += fees;\n\n // Decrease total queued amount by request amount\n totalQueued -= request.amount;\n\n // Increment queue cursor if request was the next request to be processed\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[requestId];\n\n // If fund wallet's balance can cover request, rely on it only\n if (withdrawnAmount <= fundBalance) {\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\n }\n // Else, cover request from both fund wallet and contract balances\n else {\n // Compute amount missing from fund wallet to cover request\n uint256 missingAmount = withdrawnAmount - fundBalance;\n\n // Decrease usable amount of underlying tokens accordingly\n usableUnderlyings -= missingAmount;\n\n // Transfer entire fund balance to request's emitter\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\n\n // Transfer missing amount from contract balance to request emitter\n underlying().safeTransfer(request.account, missingAmount);\n }\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Cancels a given withdrawal request. The request emitter receive back its\n * L-Tokens and no fees will be charged.\n * @param requestId The ID of the withdrawal request to cancel.\n */\n function cancelWithdrawalRequest(\n uint256 requestId\n ) public whenNotPaused notBlacklisted(_msgSender()) {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure request belongs to caller\n require(_msgSender() == request.account, \"L57\");\n\n // Decrease total amount queued accordingly\n totalQueued -= request.amount;\n\n // Delete the withdrawal request from queue\n delete withdrawalQueue[requestId];\n\n // Inform listeners of this cancelled withdrawal request activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Cancelled,\n NO_ID\n );\n\n // Mint back L-Tokens to account\n _mint(request.account, uint256(request.amount));\n }\n\n /**\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\n * whenever those are required to fulfill some withdrawal requests.\n * @dev The function will revert if repatriated amount makes the contract exceeding\n * the retention rate.\n * @param amount The amount of underlying tokens to repatriate.\n */\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\n // Ensure the fund wallet has enough funds to repatriate\n require(amount <= underlying().balanceOf(fund), \"L58\");\n\n // Calculate new contract usable balance\n uint256 newBalance = usableUnderlyings + amount;\n\n // Ensure the new balance doesn't exceed the retention rate\n require(newBalance <= getExpectedRetained(), \"L59\");\n\n // Increase usable underlyings amount by repatriated amount\n usableUnderlyings += amount;\n\n // Transfer amount from fund wallet to contract\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\n }\n\n /// @notice Used by owner to claim fees generated from successful withdrawals.\n function claimFees() external onlyOwner {\n // Ensure there are some fees to claim\n require(unclaimedFees > 0, \"L60\");\n\n // Ensure the contract holds enough underlying tokens to cover fees\n require(usableUnderlyings >= unclaimedFees, \"L61\");\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= unclaimedFees;\n\n // Store fees amount in memory and reset unclaimed fees amount\n uint256 fees = unclaimedFees;\n unclaimedFees = 0;\n\n // Transfer unclaimed fees to owner\n underlying().safeTransfer(owner(), fees);\n }\n}\n" + }, + "contracts/src/PreMining.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LToken} from \"./LToken.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/security/Pausable.sol\";\n\n/**\n * @title PreMining\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n\n * @notice PreMining pool contract, allowing accounts to lock underlying tokens in a \n * pre-defined L-Token contract, over a given duration (in months), in exchange of \n * vested LDY rewards.\n * \n * @dev Intuition\n * \n * Lifecycle of a lockdrop pool is composed by 3 main phases:\n * 1) Deposit: During this phase, users can lock their underlying tokens.\n * 2) Claim: During this phase, users can claim their LDY rewards.\n * 3) Recovery: During this phase, owner can recover remaining ERC20 on the contract.\n * \n * Transitioning between two phases is manually triggered by contract's owner.\n * To ensure fair usage of this power and prevent potential misuse:\n * - the Recovery phase cannot start before 3 months after the end of rewards vesting,\n * - the Recovery phase cannot start before 3 months after the maximum lock end.\n * \n * Finally, note that this contract proxies main L-Token contract's functions:\n * - lock() --> deposit()\n * - instantUnlock() --> instantWithdrawal()\n * - requestUnlock() --> requestWithdrawal()\n * This design enables users to interact with the PreMining contract in a similar fashion\n * to the L-Token contract.\n * \n * @dev Definitions:\n * - Locker: An account that has locked underlying tokens in the pool.\n * \n * @custom:security-contact security@ledgity.com\n */\ncontract PreMining is Ownable2Step, Pausable {\n using SafeERC20 for IERC20;\n\n /**\n * @notice Represents the lock information of an account.\n * @param amount Amount of underlying tokens locked.\n * @param duration Duration of the lock (in months).\n * @param hasUnlocked Whether the account has unlocked its locked tokens.\n * @param claimedRewards Amount of LDY rewards already claimed.\n * @param lockEndTimestamp Timestamp at which the account's lock ends.\n */\n struct AccountLock {\n uint240 amount;\n uint8 duration;\n bool hasUnlocked;\n uint216 claimedRewards;\n uint40 lockEndTimestamp;\n }\n\n /// @notice Holds the amount of LDY to be distributed to lockers.\n uint256 public immutable maxDistributedLDY;\n\n /// @notice Holds the maximum total amount of L-Tokens that can be locked.\n uint256 public immutable lockedHardCap;\n\n /// @notice Holds the minimum possible lock duration (in months).\n uint8 public immutable minLockDuration;\n\n /// @notice Holds the maximum possible lock duration (in months).\n uint8 public immutable maxLockDuration;\n\n /// @notice Holds the duration of LDY rewards vesting (in months).\n uint8 public immutable vestingDuration;\n\n /// @notice Holds a reference to the locked L-Token contract.\n LToken public immutable lToken;\n\n /// @notice Holds a reference to the L-Token underlying stablecoin.\n IERC20 public immutable underlyingToken;\n\n /// @notice Holds the max pool weight.\n uint256 public immutable maxWeight;\n\n /// @notice Holds a reference to the LDY token contract.\n IERC20 public ldyToken;\n\n /// @notice Holds lockers' participations informations.\n mapping(address => AccountLock) public accountsLocks;\n\n /// @notice Holds the total amount of locked underlying tokens.\n uint256 public totalLocked;\n\n /// @notice Holds whether the Deposit phase has ended.\n bool public hasDepositPhaseEnded;\n\n /// @notice Holds whether the Claim phase has started.\n bool public hasClaimPhaseStarted;\n\n /// @notice Holds whether the Recovery phase has started.\n bool public hasRecoveryPhaseStarted;\n\n /// @notice Holds the timestamp at which the Claim phase started.\n uint256 public claimPhaseStartTimestamp;\n\n /// @notice Holds an ordered queue of accounts that requested to unlock their tokens.\n address[] public unlockRequests;\n\n /// @notice Holds the index of the first request in the queue (a.k.a, next one to be processed).\n uint256 public unlockRequestsCursor;\n\n /// @notice Emitted to inform about a new lock/deposit.\n event Lock(address indexed account, uint256 amount, uint8 duration);\n\n /// @notice Top-level checks and code shared by both unlock functions.\n modifier safeUnlock() {\n // Ensure that the account's lock has ended\n require(accountsLocks[msg.sender].lockEndTimestamp <= block.timestamp, \"L68\");\n\n // Ensure the account hasn't already unlocked its tokens\n require(!accountsLocks[msg.sender].hasUnlocked, \"L69\");\n\n // Ensure the account has something to unlock\n require(accountsLocks[msg.sender].amount > 0, \"L70\");\n\n // Indicate that account has unlocked its tokens\n accountsLocks[msg.sender].hasUnlocked = true;\n _;\n }\n\n /**\n * @notice This constructor function etches the lockdrop terms in immutable states.\n * Ensuring that those terms cannot be modified after deployment.\n * @param lTokenAddress_ Address of the L-Token contract to use.\n * @param maxDistributedLDY_ Amount of LDY to be distributed to lockers.\n * @param lockedHardCap_ Maximum total amount of L-Tokens that can be locked.\n * @param minLockDuration_ Minimum possible lock duration (in months).\n * @param maxLockDuration_ Maximum possible lock duration (in months).\n * @param vestingDuration_ Duration of LDY rewards vesting (in months).\n */\n constructor(\n address lTokenAddress_,\n uint256 maxDistributedLDY_,\n uint256 lockedHardCap_,\n uint8 minLockDuration_,\n uint8 maxLockDuration_,\n uint8 vestingDuration_\n ) {\n // Ensure minLockDuration is at least 1 month\n require(minLockDuration_ >= 1, \"L72\");\n\n // Ensure minLockDuration is not greater than maxLockDuration\n require(minLockDuration_ <= maxLockDuration_, \"L73\");\n\n // Set immutable states\n lToken = LToken(lTokenAddress_);\n underlyingToken = IERC20(address(lToken.underlying()));\n lockedHardCap = lockedHardCap_;\n maxDistributedLDY = maxDistributedLDY_;\n minLockDuration = minLockDuration_;\n maxLockDuration = maxLockDuration_;\n vestingDuration = vestingDuration_;\n maxWeight = lockedHardCap * uint256(maxLockDuration);\n }\n\n /**\n * @notice Public implementation of Pausable's pausing and unpausing functions, but\n * restricted to contract's owner.\n */\n function pause() public onlyOwner {\n _pause();\n }\n\n function unpause() public onlyOwner {\n _unpause();\n }\n\n /**\n * @notice Updates the LDY token contract address.\n * @dev As the first Ledgity Yield lockdrop campaigns will start before the LDY TGE,\n * this function allows the contract's owner to set the LDY token address once it\n * becomes available.\n * @param ldyTokenAddress Address of the LDY token contract.\n */\n function setLDYToken(address ldyTokenAddress) external onlyOwner {\n // Prevent owner from changing the LDY address after Claim phase has started\n require(!hasClaimPhaseStarted, \"L74\");\n\n // Set LDY token address\n ldyToken = IERC20(ldyTokenAddress);\n }\n\n /**\n * @notice Closes the Deposit phase. After calling this function, account won't be\n * able to lock additional underlying tokens anymore.\n */\n function endDepositPhase() external onlyOwner {\n hasDepositPhaseEnded = true;\n }\n\n /**\n * @notice Opens the Claim phase. After calling this function, lockers will be able\n * to start claiming their LDY rewards.\n */\n function startClaimPhase() external onlyOwner {\n // Ensure Claim phase has not already started\n require(!hasClaimPhaseStarted, \"L76\");\n\n // Ensure that LDY token address is available\n require(address(ldyToken) != address(0), \"L77\");\n\n // Set Claim phase as started and store the start timestamp\n hasClaimPhaseStarted = true;\n claimPhaseStartTimestamp = block.timestamp;\n }\n\n /**\n * @notice Opens the Recovery phase. After calling this function, the contract owner\n * will be able to recover remaining ERC20 tokens on the contract.\n * Note that this won't close the Claim phase and lockers will still be able to claim\n * their LDY rewards.\n */\n function startRecoveryPhase() external onlyOwner {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L79\");\n\n // Compute some durations in seconds\n uint256 threeMonthsInSecond = 3 * 30 days;\n uint256 vestingInSecond = uint256(vestingDuration) * 30 days;\n uint256 maxLockInSecond = uint256(maxLockDuration) * 30 days;\n\n // Compute timestamp of vesting end + 3 months\n uint256 afterVestingTimestamp = claimPhaseStartTimestamp +\n vestingInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the end of reward vesting\n // This prevents owner from recovering LDY before lockers can claim their rewards\n require(block.timestamp >= afterVestingTimestamp, \"L80\");\n\n // Compute end of maximum lock + 3 months\n // Note that claimPhaseStartTimestamp is used for simplicity even if it can exist a time\n // span between Deposit and Claim phases.\n uint256 afterMaxLockTimestamp = claimPhaseStartTimestamp +\n maxLockInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the maximum lock end\n // This prevents owner from recovering underlying tokens before lockers can unlock those\n require(block.timestamp >= afterMaxLockTimestamp, \"L81\");\n\n // Set recovery phase as started\n hasRecoveryPhaseStarted = true;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address. Will revert if\n * recovery phase has not started yet or if the contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) external onlyOwner {\n // Ensure recovery phase has started\n require(hasRecoveryPhaseStarted, \"L82\");\n\n // Create a reference to token's contract\n IERC20 tokenContract = IERC20(tokenAddress);\n\n // Ensure there is enough tokens to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L83\");\n\n // Transfer the recovered token amount to the sender (owner)\n tokenContract.safeTransfer(msg.sender, amount);\n }\n\n /**\n * @notice Compute the total amount of LDY rewards that a given account is eligible to.\n * @dev Note: This function neither considers vesting nor already claimed rewards.\n * @param account The account to compute the eligible rewards of.\n * @return The total amount of LDY rewards that the account is eligible to.\n */\n function eligibleRewardsOf(address account) public view returns (uint256) {\n // Compute account's lock weight\n uint256 lockerWeight = accountsLocks[account].amount * accountsLocks[account].duration;\n\n // Compute amount of LDY that this locker is eligible to\n if (maxWeight == 0) return 0;\n else return (maxDistributedLDY * lockerWeight) / maxWeight;\n }\n\n /**\n * @notice Allows locking a specified amount of underlying tokens for a given duration.\n * By locking, an account became eligible to a portion of the distributed LDY rewards.\n * @dev This function proxies LToken.deposit()\n * @dev Lockers can extend their lock duration by calling this function again with a\n * greater duration and 0 as amount.\n * @param amount Amount of underlying tokens to lock.\n * @param duration Duration of the lock (in months).\n */\n function lock(uint256 amount, uint8 duration) external whenNotPaused {\n // Ensure Deposit phase has not ended yet\n require(!hasDepositPhaseEnded, \"L84\");\n\n // Ensure account hasn't already unlocked a past lock\n require(!accountsLocks[msg.sender].hasUnlocked, \"L71\");\n\n // Ensure lock duration is in valid range\n require(duration >= minLockDuration && duration <= maxLockDuration, \"L85\");\n\n // Ensure it won't exceed the hardcap\n require(totalLocked + amount <= uint256(lockedHardCap), \"L86\");\n\n // Increase account's locked amount\n accountsLocks[msg.sender].amount += uint240(amount);\n\n // Increase total locked amount accordingly\n totalLocked += amount;\n\n // Use existing lock duration if greater than the new one\n uint8 existingDuration = accountsLocks[msg.sender].duration;\n uint8 appliedDuration = existingDuration > duration ? existingDuration : duration;\n\n // Update account's lock duration\n accountsLocks[msg.sender].duration = appliedDuration;\n\n // Update account's lock end timestamp\n accountsLocks[msg.sender].lockEndTimestamp = uint40(\n block.timestamp + uint40(appliedDuration) * 30 days\n );\n\n // Emit a Lock event\n emit Lock(msg.sender, amount, appliedDuration);\n\n // If amount is 0, skip deposit\n if (amount == 0) return;\n\n // Transfer underlyingToken from account to contract\n underlyingToken.safeTransferFrom(msg.sender, address(this), amount);\n\n // Deposit USDC in the L-Token contract\n underlyingToken.safeApprove(address(lToken), amount);\n lToken.deposit(amount);\n }\n\n /**\n * @notice Allows the caller to instaneously unlock its locked amount of underlying\n * tokens.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestUnlock() function otherwise.\n */\n function instantUnlock() external whenNotPaused safeUnlock {\n // Retrieve underlying tokens from the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.instantWithdrawal(unlockedAmount);\n\n // Transfer underlying tokens back to caller\n underlyingToken.safeTransfer(msg.sender, unlockedAmount);\n }\n\n /**\n * @notice Allows the call to request for the unlocking of its locked amount of\n * underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n */\n function requestUnlock() external payable whenNotPaused safeUnlock {\n // Put account in the unlock requests queue\n unlockRequests.push(msg.sender);\n\n // Request underlying tokens to the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.requestWithdrawal{value: msg.value}(unlockedAmount);\n }\n\n /**\n * @notice Processes queued unlock requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n */\n function processUnlockRequests() external onlyOwner {\n // Store the current request ID to process\n uint256 processedId = unlockRequestsCursor;\n\n // Loop over remaining requests\n while (processedId < unlockRequests.length) {\n // Prevent OOG by stopping request processing if there is not enough gas left\n // to continue the loop and properly end the function call.\n if (gasleft() < 45000) break;\n\n // Retrieve the request account\n address unlockAccount = unlockRequests[processedId];\n\n // Retrieve the unlocked amount\n uint256 unlockAmount = accountsLocks[unlockAccount].amount;\n\n // If the request has already been processed, skip it\n if (unlockAccount != address(0)) {\n // If the contract doesn't hold enough underlying tokens to process the request, stop here\n if (underlyingToken.balanceOf(address(this)) < unlockAmount) break;\n\n // Delete the request\n delete unlockRequests[processedId];\n\n // Transfer underlying back to account\n underlyingToken.safeTransfer(unlockAccount, unlockAmount);\n }\n\n // Increment processed request ID\n processedId++;\n }\n\n // Write back the cursor in storage\n unlockRequestsCursor = processedId;\n }\n\n /**\n * @notice Computes the amount of LDY rewards available to claim for a given account.\n * @dev This function considers vesting and already claimed rewards.\n * @param account The account to compute the available rewards of.\n * @return The amount of LDY rewards available to claim.\n */\n function availableToClaim(address account) public view returns (uint256) {\n // Compute total amount of rewards allocated to this locker\n uint256 totalEligibleRewards = eligibleRewardsOf(account);\n\n // Compute vesting duration in seconds\n uint256 vestingInSeconds = uint256(vestingDuration) * 30 days;\n\n // Compute elapsed months since claim phase started, and cap it to vesting duration\n uint256 elapsedTime = block.timestamp - claimPhaseStartTimestamp;\n if (elapsedTime > vestingInSeconds) elapsedTime = vestingInSeconds;\n\n // Compute total available to claim (proportionally to elapsed time)\n uint256 totalAvailableToClaim = (totalEligibleRewards * elapsedTime) / vestingInSeconds;\n\n // Else return net claimable (available minus already claimed)\n return totalAvailableToClaim - accountsLocks[account].claimedRewards;\n }\n\n /// @notice Allows the caller to claim its available LDY rewards.\n function claimRewards() external whenNotPaused {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L87\");\n\n // Compute claimable LDY rewards\n uint256 claimableLDY = availableToClaim(msg.sender);\n\n // Increase account claimed amount accordingly\n accountsLocks[msg.sender].claimedRewards += uint216(claimableLDY);\n\n // Transfer rewards to account\n ldyToken.safeTransfer(msg.sender, claimableLDY);\n }\n}\n" + } + }, + "settings": { + "evmVersion": "london", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/contracts/hardhat/deployments/localhost/APRHistory.json b/contracts/hardhat/deployments/localhost/APRHistory.json index 37e7eb58..c3763256 100644 --- a/contracts/hardhat/deployments/localhost/APRHistory.json +++ b/contracts/hardhat/deployments/localhost/APRHistory.json @@ -93,7 +93,7 @@ "type": "function" } ], - "transactionHash": "0xafccdf5241d9fbdb5f18618a99997b36d54fb93e9197a8d9c7446d9c8b23c904", + "transactionHash": "0x0e6dab31c84fb63f44733779aef6382f0712aa4640cf6cd03450d424b51e0bd6", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -101,8 +101,8 @@ "transactionIndex": 0, "gasUsed": "745793", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6923201a2accb6ebcb48e5ceefe953b100f1dd2db4c05b2693a3730a0b5e9a04", - "transactionHash": "0xafccdf5241d9fbdb5f18618a99997b36d54fb93e9197a8d9c7446d9c8b23c904", + "blockHash": "0x06eaee9cb46dbdf6ea185c9a409ef0aa622bb0e25a0d36b870bba4c3413606cf", + "transactionHash": "0x0e6dab31c84fb63f44733779aef6382f0712aa4640cf6cd03450d424b51e0bd6", "logs": [], "blockNumber": 7, "cumulativeGasUsed": "745793", @@ -111,10 +111,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "1c94255f5edec71501da736e9b19ae5f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref2\",\"type\":\"tuple\"}],\"name\":\"eq\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref\",\"type\":\"tuple\"}],\"name\":\"incrementReference\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Intuition: Each checkpoint in an APR history consists of two data: - the creation timestamp - the APR at that time Given that reading and writing to storage slots are among the most costly operations in Solidity, this library provides a way to store those data in a way that minimizes the number of used storage slots. Instead of storing each checkpoint in a separate storage slot, this library facilitates the packing of up to 4 checkpoints in a single storage slot.Definitions: - Checkpoint: A record of an APR change - Pack: A collection of 4 checkpoints stored in a single storage slot - History: A dynamic array of packs - Reference: A storage pointer to a checkpoint in the APR history - CheckpointData: An in-memory representation of a checkpoint dataValue limitation: This library can accommodate APRs only up to 65.536%. This is however sufficient for APR in LToken contract, which is expected to remain below 10%.For further details, see \\\"APRHistory\\\" section of whitepaper.\",\"kind\":\"dev\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"params\":{\"ref1\":\"The first reference to compare.\",\"ref2\":\"The second reference to compare.\"},\"returns\":{\"_0\":\"Whether the two references points to the same checkpoint.\"}},\"getAPR(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history array to read APR from.\"},\"returns\":{\"_0\":\"The latest checkpoint's APR.\"}},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference of the checkpoint data to extract.\",\"self\":\"The APR history to extract the checkpoint from.\"},\"returns\":{\"_0\":\"The extracted checkpoint's data.\"}},\"getLatestReference(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history to extract the reference from.\"},\"returns\":{\"_0\":\"The reference of the latest checkpoint.\"}},\"incrementReference(APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference to be incremented.\"},\"returns\":{\"_0\":\"The incremented reference.\"}},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\",\"self\":\"The array of packs to write the new checkpoint to.\"}}},\"title\":\"APRHistory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"notice\":\"Compares two checkpoints references.\"},\"getAPR(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the APR of the latest checkpoint written in the APR history.\"},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"notice\":\"Extracts checkpoint data from a given reference and in APR history.\"},\"getLatestReference(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the reference to the most recently added checkpoint in the APR history.\"},\"incrementReference(APRHistory.Reference)\":{\"notice\":\"Returns the reference of the checkpoint that should come right after the referenced checkpoint in the APR history.\"},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"notice\":\"Write a new APR checkpoint at the end of the given history array.\"}},\"notice\":\"This library offers utilities to efficiently maintain the history of an on-chain APR (Annual Percentage Rate) state. Each entry in this history is called a \\\"checkpoint\\\".\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/libs/APRHistory.sol\":\"APRHistory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x610c8561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea264697066735822122037273d18074a95e25b4ee897634daa0209a4e04e6077ddaa99b1038cb31b2bc164736f6c63430008120033", - "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea264697066735822122037273d18074a95e25b4ee897634daa0209a4e04e6077ddaa99b1038cb31b2bc164736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref2\",\"type\":\"tuple\"}],\"name\":\"eq\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"ref\",\"type\":\"tuple\"}],\"name\":\"incrementReference\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"packIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"cursorIndex\",\"type\":\"uint32\"}],\"internalType\":\"struct APRHistory.Reference\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Intuition: Each checkpoint in an APR history consists of two data: - the creation timestamp - the APR at that time Given that reading and writing to storage slots are among the most costly operations in Solidity, this library provides a way to store those data in a way that minimizes the number of used storage slots. Instead of storing each checkpoint in a separate storage slot, this library facilitates the packing of up to 4 checkpoints in a single storage slot.Definitions: - Checkpoint: A record of an APR change - Pack: A collection of 4 checkpoints stored in a single storage slot - History: A dynamic array of packs - Reference: A storage pointer to a checkpoint in the APR history - CheckpointData: An in-memory representation of a checkpoint dataValue limitation: This library can accommodate APRs only up to 65.536%. This is however sufficient for APR in LToken contract, which is expected to remain below 10%.For further details, see \\\"APRHistory\\\" section of whitepaper.\",\"kind\":\"dev\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"params\":{\"ref1\":\"The first reference to compare.\",\"ref2\":\"The second reference to compare.\"},\"returns\":{\"_0\":\"Whether the two references points to the same checkpoint.\"}},\"getAPR(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history array to read APR from.\"},\"returns\":{\"_0\":\"The latest checkpoint's APR.\"}},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference of the checkpoint data to extract.\",\"self\":\"The APR history to extract the checkpoint from.\"},\"returns\":{\"_0\":\"The extracted checkpoint's data.\"}},\"getLatestReference(APRHistory.Pack[] storage)\":{\"params\":{\"self\":\"The history to extract the reference from.\"},\"returns\":{\"_0\":\"The reference of the latest checkpoint.\"}},\"incrementReference(APRHistory.Reference)\":{\"params\":{\"ref\":\"The reference to be incremented.\"},\"returns\":{\"_0\":\"The incremented reference.\"}},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\",\"self\":\"The array of packs to write the new checkpoint to.\"}}},\"title\":\"APRHistory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"eq(APRHistory.Reference,APRHistory.Reference)\":{\"notice\":\"Compares two checkpoints references.\"},\"getAPR(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the APR of the latest checkpoint written in the APR history.\"},\"getDataFromReference(APRHistory.Pack[] storage,APRHistory.Reference)\":{\"notice\":\"Extracts checkpoint data from a given reference and in APR history.\"},\"getLatestReference(APRHistory.Pack[] storage)\":{\"notice\":\"Retrieves the reference to the most recently added checkpoint in the APR history.\"},\"incrementReference(APRHistory.Reference)\":{\"notice\":\"Returns the reference of the checkpoint that should come right after the referenced checkpoint in the APR history.\"},\"setAPR(APRHistory.Pack[] storage,uint16)\":{\"notice\":\"Write a new APR checkpoint at the end of the given history array.\"}},\"notice\":\"This library offers utilities to efficiently maintain the history of an on-chain APR (Annual Percentage Rate) state. Each entry in this history is called a \\\"checkpoint\\\".\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/libs/APRHistory.sol\":\"APRHistory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x610c8561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea26469706673582212205b03f768c60a2571d717f55337fed81ef1848c3b818b496675eb9481d6ef8f7e64736f6c63430008120033", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061006c5760003560e01c80630704abfa146100715780634ead0c53146100aa578063593e7d88146100cd5780637c3cb8a614610106578063836b267814610119578063867c775a1461013f575b600080fd5b61008461007f366004610a63565b610161565b604080518251815260209283015163ffffffff1692810192909252015b60405180910390f35b6100bd6100b8366004610aed565b61029a565b60405190151581526020016100a1565b6100e06100db366004610b22565b6102ca565b60408051825161ffff16815260209283015164ffffffffff1692810192909252016100a1565b610084610114366004610b46565b610506565b61012c610127366004610a63565b6105cc565b60405161ffff90911681526020016100a1565b81801561014b57600080fd5b5061015f61015a366004610b62565b6105ef565b005b604080518082019091526000808252602082015281546000036101b05760405162461bcd60e51b81526020600482015260026024820152614c3560f01b60448201526064015b60405180910390fd5b81546000906101c190600190610baf565b905060008382815481106101d7576101d7610bc2565b6000918252602082206002600390920201015463ffffffff169150829003610234578063ffffffff166000036102345760405162461bcd60e51b8152602060048201526002602482015261261b60f11b60448201526064016101a7565b8063ffffffff1660000361026c57604051806040016040528060018461025a9190610baf565b81526003602090910152949350505050565b604051806040016040528083815260200160018361028a9190610bd8565b63ffffffff169052949350505050565b805182516000911480156102c15750816020015163ffffffff16836020015163ffffffff16145b90505b92915050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561031e5760405162461bcd60e51b8152602060048201526002602482015261261960f11b60448201526064016101a7565b82548251106103545760405162461bcd60e51b81526020600482015260026024820152614c3360f01b60448201526064016101a7565b60008383600001518154811061036c5761036c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161039b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116103fa575050509284525050506002919091015463ffffffff9081166020928301526040830151918601519293509081169116106104975760405162461bcd60e51b8152602060048201526002602482015261130d60f21b60448201526064016101a7565b60405180604001604052808260000151856020015163ffffffff16600481106104c2576104c2610bc2565b602002015161ffff1681526020018260200151856020015163ffffffff16600481106104f0576104f0610bc2565b602002015164ffffffffff169052949350505050565b60408051808201909152600080825260208201526003826020015163ffffffff16111561055a5760405162461bcd60e51b81526020600482015260026024820152614c3160f01b60448201526064016101a7565b816020015163ffffffff16600303610598576040518060400160405280836000015160016105889190610bfc565b8152600060209091015292915050565b604051806040016040528083600001518152602001836020015160016105be9190610c0f565b63ffffffff16905292915050565b6000806105d883610161565b905060006105e684836102ca565b51949350505050565b81546000901561060a5761060561011484610161565b61061f565b60408051808201909152600080825260208201525b83548151919250116106345761063483610824565b60008382600001518154811061064c5761064c610bc2565b600091825260209091206040805160e08101909152916003020181606081018260048282826020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161067b57505050928452505060408051608081019182905260209093019291506001840190600490826000855b82829054906101000a900464ffffffffff1664ffffffffff16815260200190600501906020826004010492830192600103820291508084116106da575050509284525050506002919091015463ffffffff9081166020928301528251918501519293508592166004811061075057610750610bc2565b602002019061ffff16908161ffff1681525050428160200151836020015163ffffffff166004811061078457610784610bc2565b64ffffffffff9092166020929092020152604081018051906107a582610c2c565b63ffffffff16905250815184548291869181106107c4576107c4610bc2565b600091825260209091208251600390920201906107e4908290600461092b565b5060208201516107fa90600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550505050565b80541580610844575061083681610161565b6020015163ffffffff166003145b6108755760405162461bcd60e51b81526020600482015260026024820152614c3760f01b60448201526064016101a7565b6040805160e08101825260006060808301828152608080850184905260a0850184905260c085018490529084528451908101855282815260208181018490528186018490529181018390528184015292820181905283546001810185558482529290208151919260030201906108ee908290600461092b565b50602082015161090490600183019060046109c1565b50604091909101516002909101805463ffffffff191663ffffffff90921691909117905550565b6001830191839082156109b15791602002820160005b8382111561098157835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610941565b80156109af5782816101000a81549061ffff0219169055600201602081600101049283019260010302610981565b505b506109bd929150610a4e565b5090565b6001830191839082156109b15791602002820160005b83821115610a1d57835183826101000a81548164ffffffffff021916908364ffffffffff16021790555092602001926005016020816004010492830192600103026109d7565b80156109af5782816101000a81549064ffffffffff0219169055600501602081600401049283019260010302610a1d565b5b808211156109bd5760008155600101610a4f565b600060208284031215610a7557600080fd5b5035919050565b600060408284031215610a8e57600080fd5b6040516040810181811067ffffffffffffffff82111715610abf57634e487b7160e01b600052604160045260246000fd5b60405282358152905080602083013563ffffffff81168114610ae057600080fd5b6020919091015292915050565b60008060808385031215610b0057600080fd5b610b0a8484610a7c565b9150610b198460408501610a7c565b90509250929050565b60008060608385031215610b3557600080fd5b82359150610b198460208501610a7c565b600060408284031215610b5857600080fd5b6102c18383610a7c565b60008060408385031215610b7557600080fd5b82359150602083013561ffff81168114610b8e57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156102c4576102c4610b99565b634e487b7160e01b600052603260045260246000fd5b63ffffffff828116828216039080821115610bf557610bf5610b99565b5092915050565b808201808211156102c4576102c4610b99565b63ffffffff818116838216019080821115610bf557610bf5610b99565b600063ffffffff808316818103610c4557610c45610b99565b600101939250505056fea26469706673582212205b03f768c60a2571d717f55337fed81ef1848c3b818b496675eb9481d6ef8f7e64736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", diff --git a/contracts/hardhat/deployments/localhost/GlobalBlacklist.json b/contracts/hardhat/deployments/localhost/GlobalBlacklist.json index 7195c4c8..12b66fd0 100644 --- a/contracts/hardhat/deployments/localhost/GlobalBlacklist.json +++ b/contracts/hardhat/deployments/localhost/GlobalBlacklist.json @@ -285,7 +285,7 @@ "transactionIndex": 0, "gasUsed": "332581", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000002000000000240000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000080400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362", + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a", "transactionHash": "0xaee795c43b7a10f17952d609bd43b93152e955c2fa1993abf9cfc84351844bd5", "logs": [ { @@ -299,7 +299,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362" + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a" }, { "transactionIndex": 0, @@ -311,7 +311,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362" + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a" } ], "blockNumber": 6, diff --git a/contracts/hardhat/deployments/localhost/GlobalBlacklist_Implementation.json b/contracts/hardhat/deployments/localhost/GlobalBlacklist_Implementation.json index 5773d778..25ef867c 100644 --- a/contracts/hardhat/deployments/localhost/GlobalBlacklist_Implementation.json +++ b/contracts/hardhat/deployments/localhost/GlobalBlacklist_Implementation.json @@ -258,7 +258,7 @@ "type": "function" } ], - "transactionHash": "0x0e8fce9014801f5c0a3a9fff8eaa8ffda2b20b92e0c2cc2243cb71ae9207af3a", + "transactionHash": "0xea739d2056b721afbfdc69bda68a3d881f724fbb18726a9cf4306ad64a7e4838", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -266,20 +266,20 @@ "transactionIndex": 0, "gasUsed": "936792", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000020000000000000000000000000000000000000000000000000000000000001000000000100000000000000", - "blockHash": "0xa501c4b83e21a58ca4eee657537a7653999efc0062fefc2bbcba7cc1a35b59fc", - "transactionHash": "0x0e8fce9014801f5c0a3a9fff8eaa8ffda2b20b92e0c2cc2243cb71ae9207af3a", + "blockHash": "0x24c2f644e6b41a97d3f67471e5608b65430202a35a26c01f197f99a292856ea9", + "transactionHash": "0xea739d2056b721afbfdc69bda68a3d881f724fbb18726a9cf4306ad64a7e4838", "logs": [ { "transactionIndex": 0, "blockNumber": 5, - "transactionHash": "0x0e8fce9014801f5c0a3a9fff8eaa8ffda2b20b92e0c2cc2243cb71ae9207af3a", + "transactionHash": "0xea739d2056b721afbfdc69bda68a3d881f724fbb18726a9cf4306ad64a7e4838", "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0xa501c4b83e21a58ca4eee657537a7653999efc0062fefc2bbcba7cc1a35b59fc" + "blockHash": "0x24c2f644e6b41a97d3f67471e5608b65430202a35a26c01f197f99a292856ea9" } ], "blockNumber": 5, @@ -289,10 +289,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "a268142553104e6d2a73dbd3773cf551", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unblacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"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\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers and getter functions to easily check against this global blacklist.For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Blacklisted(address)\":{\"details\":\"Emitted when `account` is blacklisted.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Unblacklisted(address)\":{\"details\":\"Emitted when `account` is unblacklisted.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"blacklist(address)\":{\"params\":{\"account\":\"The account's address to be blacklisted.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"isBlacklisted(address)\":{\"params\":{\"account\":\"Address of the account to check.\"},\"returns\":{\"_0\":\"'true' if the account is blacklisted, 'false' otherwise\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"unBlacklist(address)\":{\"params\":{\"account\":\"The account's address to be un-blacklisted.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"_list\":{\"details\":\"This mapping is made private and isBlacklisted() should be used instead.This helps saving gas in some scenario. See isBlacklisted() documentation for more details.\"}},\"title\":\"GlobalBlacklist\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"blacklist(address)\":{\"notice\":\"Adds a given account to the blacklist.\"},\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"isBlacklisted(address)\":{\"notice\":\"Checks whether a given account is blacklisted.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"unBlacklist(address)\":{\"notice\":\"Removes a given account from the blacklist.\"}},\"notice\":\"Holds a global mapping of blacklisted accounts shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalBlacklist.sol\":\"GlobalBlacklist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610f8461011860003960008181610278015281816102c101528181610360015281816103a001526104330152610f846000f3fe60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a018129cb5f06c0c7c5a811655ab761d448869bf794f6ffc6aaf1e624507d4f564736f6c63430008120033", - "deployedBytecode": "0x60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a018129cb5f06c0c7c5a811655ab761d448869bf794f6ffc6aaf1e624507d4f564736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unblacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"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\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers and getter functions to easily check against this global blacklist.For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Blacklisted(address)\":{\"details\":\"Emitted when `account` is blacklisted.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Unblacklisted(address)\":{\"details\":\"Emitted when `account` is unblacklisted.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"blacklist(address)\":{\"params\":{\"account\":\"The account's address to be blacklisted.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"isBlacklisted(address)\":{\"params\":{\"account\":\"Address of the account to check.\"},\"returns\":{\"_0\":\"'true' if the account is blacklisted, 'false' otherwise\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"unBlacklist(address)\":{\"params\":{\"account\":\"The account's address to be un-blacklisted.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"_list\":{\"details\":\"This mapping is made private and isBlacklisted() should be used instead.This helps saving gas in some scenario. See isBlacklisted() documentation for more details.\"}},\"title\":\"GlobalBlacklist\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"blacklist(address)\":{\"notice\":\"Adds a given account to the blacklist.\"},\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"isBlacklisted(address)\":{\"notice\":\"Checks whether a given account is blacklisted.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"unBlacklist(address)\":{\"notice\":\"Removes a given account from the blacklist.\"}},\"notice\":\"Holds a global mapping of blacklisted accounts shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalBlacklist.sol\":\"GlobalBlacklist\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610f8461011860003960008181610278015281816102c101528181610360015281816103a001526104330152610f846000f3fe60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c3e56728bb5ecb9dfe5bcf77d344800959c0dd8e32eddc2c1466e0f69413072564736f6c63430008120033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c80638da5cb5b116100645780638da5cb5b14610133578063c4d66de814610160578063f2fde38b14610180578063f762e734146101a0578063f9f92be4146101be578063fe575a87146101de57600080fd5b80631a895266146100a15780633659cfe6146100c35780634f1ef286146100e357806352d1902d146100f6578063715018a61461011e575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610c84565b61020e565b005b3480156100cf57600080fd5b506100c16100de366004610c84565b61026e565b6100c16100f1366004610cb7565b610356565b34801561010257600080fd5b5061010b610426565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506100c16104d9565b34801561013f57600080fd5b5061014861050f565b6040516001600160a01b039091168152602001610115565b34801561016c57600080fd5b506100c161017b366004610c84565b610582565b34801561018c57600080fd5b506100c161019b366004610c84565b61069c565b3480156101ac57600080fd5b5060c9546001600160a01b0316610148565b3480156101ca57600080fd5b506100c16101d9366004610c84565b6106d1565b3480156101ea57600080fd5b506101fe6101f9366004610c84565b610769565b6040519015158152602001610115565b6102166107a0565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916905590519182527f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b91015b60405180910390a150565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102bf5760405162461bcd60e51b81526004016102b690610d7b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610308600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461032e5760405162461bcd60e51b81526004016102b690610dc7565b61033781610801565b6040805160008082526020820190925261035391839190610809565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361039e5760405162461bcd60e51b81526004016102b690610d7b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103e7600080516020610f08833981519152546001600160a01b031690565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016102b690610dc7565b61041682610801565b61042282826001610809565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102b6565b50600080516020610f0883398151915290565b6104e16107a0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016102b6565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190610e13565b905090565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102b6565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064b82610979565b6106536109a9565b8015610422576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6106a46107a0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016102b6565b6106d96107a0565b6001600160a01b0381166107155760405162461bcd60e51b815260206004820152600360248201526204c32360ec1b60448201526064016102b6565b6001600160a01b038116600081815260fc6020908152604091829020805460ff1916600117905590519182527fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559101610263565b60006001600160a01b03821661078157506000919050565b506001600160a01b0316600090815260fc602052604090205460ff1690565b336107a961050f565b6001600160a01b0316146107ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b6565b565b6103536107a0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156108415761083c836109d0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561089b575060408051601f3d908101601f1916820190925261089891810190610e30565b60015b6108fe5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102b6565b600080516020610f08833981519152811461096d5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102b6565b5061083c838383610a6c565b600054610100900460ff166109a05760405162461bcd60e51b81526004016102b690610e49565b61035381610a97565b600054610100900460ff166107ff5760405162461bcd60e51b81526004016102b690610e49565b6001600160a01b0381163b610a3d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b6565b600080516020610f0883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a7583610ae0565b600082511180610a825750805b1561083c57610a918383610b20565b50505050565b600054610100900460ff16610abe5760405162461bcd60e51b81526004016102b690610e49565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b610ae9816109d0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b458383604051806060016040528060278152602001610f2860279139610b4c565b9392505050565b6060600080856001600160a01b031685604051610b699190610eb8565b600060405180830381855af49150503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b5091509150610bba86838387610bc4565b9695505050505050565b60608315610c33578251600003610c2c576001600160a01b0385163b610c2c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b6565b5081610c3d565b610c3d8383610c45565b949350505050565b815115610c555781518083602001fd5b8060405162461bcd60e51b81526004016102b69190610ed4565b6001600160a01b038116811461035357600080fd5b600060208284031215610c9657600080fd5b8135610b4581610c6f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610cca57600080fd5b8235610cd581610c6f565b9150602083013567ffffffffffffffff80821115610cf257600080fd5b818501915085601f830112610d0657600080fd5b813581811115610d1857610d18610ca1565b604051601f8201601f19908116603f01168101908382118183101715610d4057610d40610ca1565b81604052828152886020848701011115610d5957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e2557600080fd5b8151610b4581610c6f565b600060208284031215610e4257600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610eaf578181015183820152602001610e97565b50506000910152565b60008251610eca818460208701610e94565b9190910192915050565b6020815260008251806020840152610ef3816040850160208701610e94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c3e56728bb5ecb9dfe5bcf77d344800959c0dd8e32eddc2c1466e0f69413072564736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", @@ -470,15 +470,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 6980, + "astId": 7768, "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", "label": "_globalOwner", "offset": 0, "slot": "201", - "type": "t_contract(GlobalOwner)4271" + "type": "t_contract(GlobalOwner)4991" }, { - "astId": 7064, + "astId": 7852, "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", "label": "__gap", "offset": 0, @@ -486,7 +486,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 4109, + "astId": 4829, "contract": "contracts/src/GlobalBlacklist.sol:GlobalBlacklist", "label": "_list", "offset": 0, @@ -517,7 +517,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(GlobalOwner)4271": { + "t_contract(GlobalOwner)4991": { "encoding": "inplace", "label": "contract GlobalOwner", "numberOfBytes": "20" diff --git a/contracts/hardhat/deployments/localhost/GlobalBlacklist_Proxy.json b/contracts/hardhat/deployments/localhost/GlobalBlacklist_Proxy.json index 2e6042d9..fbaa2853 100644 --- a/contracts/hardhat/deployments/localhost/GlobalBlacklist_Proxy.json +++ b/contracts/hardhat/deployments/localhost/GlobalBlacklist_Proxy.json @@ -79,7 +79,7 @@ "transactionIndex": 0, "gasUsed": "332581", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000002000000000240000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000080400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362", + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a", "transactionHash": "0xaee795c43b7a10f17952d609bd43b93152e955c2fa1993abf9cfc84351844bd5", "logs": [ { @@ -93,7 +93,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362" + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a" }, { "transactionIndex": 0, @@ -105,7 +105,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0xe41aef68019bd08276871a0e87bafdb090c9d6ea2ca11a8d6a6f6dddfa3b5362" + "blockHash": "0xac1729c1d4569c328ceb47a1ca47e5109c720d0a9f1a2389ae8997fba990784a" } ], "blockNumber": 6, diff --git a/contracts/hardhat/deployments/localhost/GlobalOwner.json b/contracts/hardhat/deployments/localhost/GlobalOwner.json index 7c2fda22..a35891da 100644 --- a/contracts/hardhat/deployments/localhost/GlobalOwner.json +++ b/contracts/hardhat/deployments/localhost/GlobalOwner.json @@ -234,7 +234,7 @@ "transactionIndex": 0, "gasUsed": "335746", "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000100800800000004000000000000000000000000400000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000200000000000041000000000002008000000000000000020000000000000000000000000000000000000000000000000800000000000000000", - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7", + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2", "transactionHash": "0x067b5a384834e714e5876cb84045bb71a643ba0e765a789a33d142522ef51d3a", "logs": [ { @@ -248,7 +248,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" }, { "transactionIndex": 0, @@ -262,7 +262,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" }, { "transactionIndex": 0, @@ -274,7 +274,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 2, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" } ], "blockNumber": 2, diff --git a/contracts/hardhat/deployments/localhost/GlobalOwner_Implementation.json b/contracts/hardhat/deployments/localhost/GlobalOwner_Implementation.json index cc8b60b8..8cc78997 100644 --- a/contracts/hardhat/deployments/localhost/GlobalOwner_Implementation.json +++ b/contracts/hardhat/deployments/localhost/GlobalOwner_Implementation.json @@ -207,7 +207,7 @@ "type": "function" } ], - "transactionHash": "0xb63f6bf580c1b82c1def1aae23537a6132b0c9bcc27152a33b003c4dec4dfabe", + "transactionHash": "0xc3174a451210ff68582925f3d36b0ea4192cb52874b799a797423b40b0cb9d41", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -215,20 +215,20 @@ "transactionIndex": 0, "gasUsed": "862049", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000200000000000000000000000000000000000400000000000000000000000000000000000000000040000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa2306a1dd17a4abdf99cd56dc5e2e57ecf5b36ea096bd8abcf5572a358ed2f80", - "transactionHash": "0xb63f6bf580c1b82c1def1aae23537a6132b0c9bcc27152a33b003c4dec4dfabe", + "blockHash": "0xeeb7a164852804232657bb3a75324fdcf2451d3696792b95d75a1361bfe05b19", + "transactionHash": "0xc3174a451210ff68582925f3d36b0ea4192cb52874b799a797423b40b0cb9d41", "logs": [ { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0xb63f6bf580c1b82c1def1aae23537a6132b0c9bcc27152a33b003c4dec4dfabe", + "transactionHash": "0xc3174a451210ff68582925f3d36b0ea4192cb52874b799a797423b40b0cb9d41", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0xa2306a1dd17a4abdf99cd56dc5e2e57ecf5b36ea096bd8abcf5572a358ed2f80" + "blockHash": "0xeeb7a164852804232657bb3a75324fdcf2451d3696792b95d75a1361bfe05b19" } ], "blockNumber": 1, @@ -238,10 +238,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "3d20376140786af30d287ee442e9b474", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalOwnableUpgradeable abstract contract. This provides them with an overriden owner() function that retrieves the owner's address from this contract instead.For further details, see \\\"GlobalOwner\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"initialize()\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"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.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalOwner\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"initialize()\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"}},\"notice\":\"Holds the address of a global owner account shared by all contracts of the Ledgity Yield's codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalOwner.sol\":\"GlobalOwner\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2a610118600039600081816101a1015281816101ea01528181610289015281816102c9015261035c0152610e2a6000f3fe6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bf4d86ddafb4e67006b30af9e139567cad9fe8a30e6aad3fb9c85abe69dc796264736f6c63430008120033", - "deployedBytecode": "0x6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bf4d86ddafb4e67006b30af9e139567cad9fe8a30e6aad3fb9c85abe69dc796264736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalOwnableUpgradeable abstract contract. This provides them with an overriden owner() function that retrieves the owner's address from this contract instead.For further details, see \\\"GlobalOwner\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"initialize()\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"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.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalOwner\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"initialize()\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"}},\"notice\":\"Holds the address of a global owner account shared by all contracts of the Ledgity Yield's codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalOwner.sol\":\"GlobalOwner\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2a610118600039600081816101a1015281816101ea01528181610289015281816102c9015261035c0152610e2a6000f3fe6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208ddf7c692a0589f9fa203d125819bd0cfd8829f2abdbea85904f31c5600a133d64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c806379ba50971161005957806379ba5097146100fd5780638129fc1c146101125780638da5cb5b14610127578063e30c397814610159578063f2fde38b1461017757600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b4b565b610197565b005b6100ab6100bb366004610b7c565b61027f565b3480156100cc57600080fd5b506100d561034f565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610402565b34801561010957600080fd5b506100ab610416565b34801561011e57600080fd5b506100ab61048d565b34801561013357600080fd5b506097546001600160a01b03165b6040516001600160a01b0390911681526020016100df565b34801561016557600080fd5b5060c9546001600160a01b0316610141565b34801561018357600080fd5b506100ab610192366004610b4b565b6105a5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101e85760405162461bcd60e51b81526004016101df90610c3e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610231600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146102575760405162461bcd60e51b81526004016101df90610c8a565b61026081610616565b6040805160008082526020820190925261027c9183919061061e565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102c75760405162461bcd60e51b81526004016101df90610c3e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610310600080516020610dae833981519152546001600160a01b031690565b6001600160a01b0316146103365760405162461bcd60e51b81526004016101df90610c8a565b61033f82610616565b61034b8282600161061e565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103ef5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101df565b50600080516020610dae83398151915290565b61040a61078e565b61041460006107e8565b565b60c95433906001600160a01b031681146104845760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101df565b61027c816107e8565b600054610100900460ff16158080156104ad5750600054600160ff909116105b806104c75750303b1580156104c7575060005460ff166001145b61052a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101df565b6000805460ff19166001179055801561054d576000805461ff0019166101001790555b610555610801565b61055d610830565b801561027c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6105ad61078e565b60c980546001600160a01b0383166001600160a01b031990911681179091556105de6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61027c61078e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106565761065183610857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b0575060408051601f3d908101601f191682019092526106ad91810190610cd6565b60015b6107135760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101df565b600080516020610dae83398151915281146107825760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101df565b506106518383836108f3565b6097546001600160a01b031633146104145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101df565b60c980546001600160a01b031916905561027c8161091e565b600054610100900460ff166108285760405162461bcd60e51b81526004016101df90610cef565b610414610970565b600054610100900460ff166104145760405162461bcd60e51b81526004016101df90610cef565b6001600160a01b0381163b6108c45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101df565b600080516020610dae83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6108fc836109a0565b6000825111806109095750805b156106515761091883836109e0565b50505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109975760405162461bcd60e51b81526004016101df90610cef565b610414336107e8565b6109a981610857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610a058383604051806060016040528060278152602001610dce60279139610a0c565b9392505050565b6060600080856001600160a01b031685604051610a299190610d5e565b600060405180830381855af49150503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5091509150610a7a86838387610a84565b9695505050505050565b60608315610af3578251600003610aec576001600160a01b0385163b610aec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101df565b5081610afd565b610afd8383610b05565b949350505050565b815115610b155781518083602001fd5b8060405162461bcd60e51b81526004016101df9190610d7a565b80356001600160a01b0381168114610b4657600080fd5b919050565b600060208284031215610b5d57600080fd5b610a0582610b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b8f57600080fd5b610b9883610b2f565b9150602083013567ffffffffffffffff80821115610bb557600080fd5b818501915085601f830112610bc957600080fd5b813581811115610bdb57610bdb610b66565b604051601f8201601f19908116603f01168101908382118183101715610c0357610c03610b66565b81604052828152886020848701011115610c1c57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ce857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d55578181015183820152602001610d3d565b50506000910152565b60008251610d70818460208701610d3a565b9190910192915050565b6020815260008251806020840152610d99816040850160208701610d3a565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208ddf7c692a0589f9fa203d125819bd0cfd8829f2abdbea85904f31c5600a133d64736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", diff --git a/contracts/hardhat/deployments/localhost/GlobalOwner_Proxy.json b/contracts/hardhat/deployments/localhost/GlobalOwner_Proxy.json index 93fe0a2f..be2b5880 100644 --- a/contracts/hardhat/deployments/localhost/GlobalOwner_Proxy.json +++ b/contracts/hardhat/deployments/localhost/GlobalOwner_Proxy.json @@ -79,7 +79,7 @@ "transactionIndex": 0, "gasUsed": "335746", "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000100800800000004000000000000000000000000400000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000200000000000041000000000002008000000000000000020000000000000000000000000000000000000000000000000800000000000000000", - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7", + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2", "transactionHash": "0x067b5a384834e714e5876cb84045bb71a643ba0e765a789a33d142522ef51d3a", "logs": [ { @@ -93,7 +93,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" }, { "transactionIndex": 0, @@ -107,7 +107,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" }, { "transactionIndex": 0, @@ -119,7 +119,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 2, - "blockHash": "0xa0b5b3b6ef71de359bef7e27f9892371b14bbe3c366f7359d1d4d079b68779c7" + "blockHash": "0x3a956c204a764f665477bca6be776ac7733f394babca203277e647a22099a8d2" } ], "blockNumber": 2, diff --git a/contracts/hardhat/deployments/localhost/GlobalPause.json b/contracts/hardhat/deployments/localhost/GlobalPause.json index 3894364f..cf8f0e9b 100644 --- a/contracts/hardhat/deployments/localhost/GlobalPause.json +++ b/contracts/hardhat/deployments/localhost/GlobalPause.json @@ -267,7 +267,7 @@ "transactionIndex": 0, "gasUsed": "335171", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000400000000080000400000000000000000000000000001000000000000000000000000000002000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038", + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc", "transactionHash": "0x5553bb49f49e690220e8077b3bf6fd1f8a403d84d29402f881adf2be52fd542f", "logs": [ { @@ -281,7 +281,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038" + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc" }, { "transactionIndex": 0, @@ -293,7 +293,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038" + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc" } ], "blockNumber": 4, diff --git a/contracts/hardhat/deployments/localhost/GlobalPause_Implementation.json b/contracts/hardhat/deployments/localhost/GlobalPause_Implementation.json index 1e6c54a7..0d6b1027 100644 --- a/contracts/hardhat/deployments/localhost/GlobalPause_Implementation.json +++ b/contracts/hardhat/deployments/localhost/GlobalPause_Implementation.json @@ -240,7 +240,7 @@ "type": "function" } ], - "transactionHash": "0xc17eac60177a21070864b467841b0e9581731b07eb366aa98a9fea2ae3a191d8", + "transactionHash": "0x02678c2fea5ba643e01339cc9be727d33b2a9b24c2ee1f0cd6375f35fe4807e8", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -248,20 +248,20 @@ "transactionIndex": 0, "gasUsed": "955363", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000", - "blockHash": "0xdf80cd13cc6b04e328deea74012ce477493ad66d62475ffc90078225233d3dea", - "transactionHash": "0xc17eac60177a21070864b467841b0e9581731b07eb366aa98a9fea2ae3a191d8", + "blockHash": "0x0ce8211e2d3e974eee28e53c0e81710ca5273391b830207e1f3243d988b95827", + "transactionHash": "0x02678c2fea5ba643e01339cc9be727d33b2a9b24c2ee1f0cd6375f35fe4807e8", "logs": [ { "transactionIndex": 0, "blockNumber": 3, - "transactionHash": "0xc17eac60177a21070864b467841b0e9581731b07eb366aa98a9fea2ae3a191d8", + "transactionHash": "0x02678c2fea5ba643e01339cc9be727d33b2a9b24c2ee1f0cd6375f35fe4807e8", "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0xdf80cd13cc6b04e328deea74012ce477493ad66d62475ffc90078225233d3dea" + "blockHash": "0x0ce8211e2d3e974eee28e53c0e81710ca5273391b830207e1f3243d988b95827" } ], "blockNumber": 3, @@ -271,10 +271,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "1c94255f5edec71501da736e9b19ae5f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalPausableUpgradeable abstract contract. This provides them with an overriden paused() function that retrieves the pause state from this contract instead.For further details, see \\\"GlobalPause\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"pause()\":{\"details\":\"Public implementation of PausableUpgradeable's pausing and unpausing functions but restricted to contract's owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalPause\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Holds a global pause state shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalPause.sol\":\"GlobalPause\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610fda610118600039600081816101f50152818161023e015281816102ef0152818161032f01526103c20152610fda6000f3fe60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b6850ce781cface9fdf0c166b79d65bd4bbb2d52856d077ee54eb215d1371b564736f6c63430008120033", - "deployedBytecode": "0x60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b6850ce781cface9fdf0c166b79d65bd4bbb2d52856d077ee54eb215d1371b564736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Specifically, some contracts within the codebase inherit from the GlobalPausableUpgradeable abstract contract. This provides them with an overriden paused() function that retrieves the pause state from this contract instead.For further details, see \\\"GlobalPause\\\" section of whitepaper.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalOwner_\":\"The address of the GlobalOwner contract.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"pause()\":{\"details\":\"Public implementation of PausableUpgradeable's pausing and unpausing functions but restricted to contract's owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"GlobalPause\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Holds a global pause state shared by all contracts of the Ledgity Yield codebase.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GlobalPause.sol\":\"GlobalPause\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610fda610118600039600081816101f50152818161023e015281816102ef0152818161032f01526103c20152610fda6000f3fe60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ab95144fd8d3a48f3ee17841544f3be991bc7971b01dc467e687088a2bee9e4c64736f6c63430008120033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c8063715018a611610064578063715018a6146101365780638456cb591461014b5780638da5cb5b14610160578063c4d66de81461018d578063f2fde38b146101ad578063f762e734146101cd57600080fd5b80633659cfe6146100a15780633f4ba83a146100c35780634f1ef286146100d857806352d1902d146100eb5780635c975abb14610113575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610cda565b6101eb565b005b3480156100cf57600080fd5b506100c16102d3565b6100c16100e6366004610d0d565b6102e5565b3480156100f757600080fd5b506101006103b5565b6040519081526020015b60405180910390f35b34801561011f57600080fd5b5060fc5460ff16604051901515815260200161010a565b34801561014257600080fd5b506100c1610468565b34801561015757600080fd5b506100c161049e565b34801561016c57600080fd5b506101756104ae565b6040516001600160a01b03909116815260200161010a565b34801561019957600080fd5b506100c16101a8366004610cda565b610521565b3480156101b957600080fd5b506100c16101c8366004610cda565b610643565b3480156101d957600080fd5b5060c9546001600160a01b0316610175565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361023c5760405162461bcd60e51b815260040161023390610dd1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610285600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b0316146102ab5760405162461bcd60e51b815260040161023390610e1d565b6102b481610678565b604080516000808252602082019092526102d091839190610680565b50565b6102db6107f0565b6102e361084f565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361032d5760405162461bcd60e51b815260040161023390610dd1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610376600080516020610f5e833981519152546001600160a01b031690565b6001600160a01b03161461039c5760405162461bcd60e51b815260040161023390610e1d565b6103a582610678565b6103b182826001610680565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104555760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610233565b50600080516020610f5e83398151915290565b6104706107f0565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610233565b6104a66107f0565b6102e36108a1565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190610e69565b905090565b600054610100900460ff16158080156105415750600054600160ff909116105b8061055b5750303b15801561055b575060005460ff166001145b6105be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610233565b6000805460ff1916600117905580156105e1576000805461ff0019166101001790555b6105ea826108de565b6105f261090e565b6105fa61093d565b80156103b1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61064b6107f0565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610233565b6102d06107f0565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156106b8576106b383610964565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610712575060408051601f3d908101601f1916820190925261070f91810190610e86565b60015b6107755760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610233565b600080516020610f5e83398151915281146107e45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610233565b506106b3838383610a00565b336107f96104ae565b6001600160a01b0316146102e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610233565b610857610a2b565b60fc805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108a9610a74565b60fc805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586108843390565b600054610100900460ff166109055760405162461bcd60e51b815260040161023390610e9f565b6102d081610aba565b600054610100900460ff166109355760405162461bcd60e51b815260040161023390610e9f565b6102e3610b03565b600054610100900460ff166102e35760405162461bcd60e51b815260040161023390610e9f565b6001600160a01b0381163b6109d15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610233565b600080516020610f5e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610a0983610b36565b600082511180610a165750805b156106b357610a258383610b76565b50505050565b60fc5460ff166102e35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610233565b60fc5460ff16156102e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610233565b600054610100900460ff16610ae15760405162461bcd60e51b815260040161023390610e9f565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16610b2a5760405162461bcd60e51b815260040161023390610e9f565b60fc805460ff19169055565b610b3f81610964565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610b9b8383604051806060016040528060278152602001610f7e60279139610ba2565b9392505050565b6060600080856001600160a01b031685604051610bbf9190610f0e565b600060405180830381855af49150503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b5091509150610c1086838387610c1a565b9695505050505050565b60608315610c89578251600003610c82576001600160a01b0385163b610c825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610233565b5081610c93565b610c938383610c9b565b949350505050565b815115610cab5781518083602001fd5b8060405162461bcd60e51b81526004016102339190610f2a565b6001600160a01b03811681146102d057600080fd5b600060208284031215610cec57600080fd5b8135610b9b81610cc5565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d2057600080fd5b8235610d2b81610cc5565b9150602083013567ffffffffffffffff80821115610d4857600080fd5b818501915085601f830112610d5c57600080fd5b813581811115610d6e57610d6e610cf7565b604051601f8201601f19908116603f01168101908382118183101715610d9657610d96610cf7565b81604052828152886020848701011115610daf57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610e7b57600080fd5b8151610b9b81610cc5565b600060208284031215610e9857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610f05578181015183820152602001610eed565b50506000910152565b60008251610f20818460208701610eea565b9190910192915050565b6020815260008251806020840152610f49816040850160208701610eea565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ab95144fd8d3a48f3ee17841544f3be991bc7971b01dc467e687088a2bee9e4c64736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", @@ -426,15 +426,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 7770, + "astId": 7768, "contract": "contracts/src/GlobalPause.sol:GlobalPause", "label": "_globalOwner", "offset": 0, "slot": "201", - "type": "t_contract(GlobalOwner)4973" + "type": "t_contract(GlobalOwner)4991" }, { - "astId": 7854, + "astId": 7852, "contract": "contracts/src/GlobalPause.sol:GlobalPause", "label": "__gap", "offset": 0, @@ -481,7 +481,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(GlobalOwner)4973": { + "t_contract(GlobalOwner)4991": { "encoding": "inplace", "label": "contract GlobalOwner", "numberOfBytes": "20" diff --git a/contracts/hardhat/deployments/localhost/GlobalPause_Proxy.json b/contracts/hardhat/deployments/localhost/GlobalPause_Proxy.json index f5762989..b5a580a9 100644 --- a/contracts/hardhat/deployments/localhost/GlobalPause_Proxy.json +++ b/contracts/hardhat/deployments/localhost/GlobalPause_Proxy.json @@ -79,7 +79,7 @@ "transactionIndex": 0, "gasUsed": "335171", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000400000000080000400000000000000000000000000001000000000000000000000000000002000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038", + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc", "transactionHash": "0x5553bb49f49e690220e8077b3bf6fd1f8a403d84d29402f881adf2be52fd542f", "logs": [ { @@ -93,7 +93,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038" + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc" }, { "transactionIndex": 0, @@ -105,7 +105,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x93079c5b76d87c21d6c9043eaa8ed4881019270e5669df8e60ed5ab38a8df038" + "blockHash": "0x4521c72e4bc4e88add0835368b204df33fcbdf6ad2e07c97199f59dc7a964dfc" } ], "blockNumber": 4, diff --git a/contracts/hardhat/deployments/localhost/LDYStaking.json b/contracts/hardhat/deployments/localhost/LDYStaking.json index bc439029..ef5c95cc 100644 --- a/contracts/hardhat/deployments/localhost/LDYStaking.json +++ b/contracts/hardhat/deployments/localhost/LDYStaking.json @@ -149,7 +149,7 @@ "type": "function" } ], - "transactionHash": "0x044133e46033be664ddaa781c1f9387f7b1de8233267e1092c07e658d167a5ec", + "transactionHash": "0x048e070ec91fbf0fb3f65d3aef9ee8e86654363859675d84b0b779416d7400a6", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -157,13 +157,13 @@ "transactionIndex": 0, "gasUsed": "312711", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000010000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x356c689f13361090c98189ce952ab62741bc0151a0d4d4b09eb424efac766f42", - "transactionHash": "0x044133e46033be664ddaa781c1f9387f7b1de8233267e1092c07e658d167a5ec", + "blockHash": "0x0bd4299c63962ec35f183499dea3b219a9fe0b4d0169ce98a0a4b4ad68c11408", + "transactionHash": "0x048e070ec91fbf0fb3f65d3aef9ee8e86654363859675d84b0b779416d7400a6", "logs": [ { "transactionIndex": 0, "blockNumber": 8, - "transactionHash": "0x044133e46033be664ddaa781c1f9387f7b1de8233267e1092c07e658d167a5ec", + "transactionHash": "0x048e070ec91fbf0fb3f65d3aef9ee8e86654363859675d84b0b779416d7400a6", "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", @@ -172,7 +172,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x356c689f13361090c98189ce952ab62741bc0151a0d4d4b09eb424efac766f42" + "blockHash": "0x0bd4299c63962ec35f183499dea3b219a9fe0b4d0169ce98a0a4b4ad68c11408" } ], "blockNumber": 8, @@ -182,10 +182,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "1c94255f5edec71501da736e9b19ae5f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"highTierAccounts\",\"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\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setHighTierAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"tierOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"This contract only implements tierOf() function from LDYStaking as it's the only one the LToken contract relies on.\",\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"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.\"},\"setHighTierAccount(address,bool)\":{\"params\":{\"account\":\"The account to update the high tier status of.\"}},\"tierOf(address)\":{\"details\":\"Dummy tierOf() function that always return that the given account is not elligible to any LDY staking tier, except if the account is in the highTierAccounts mapping.\",\"params\":{\"account\":\"The account to check the tier of.\"}},\"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.\"}},\"stateVariables\":{\"highTierAccounts\":{\"details\":\"This is notably used to allow PreMining contracts to benefit from 0% withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\"}},\"title\":\"LDYStaking\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"highTierAccounts(address)\":{\"notice\":\"Holds a mapping of addresses that default to the highest staking tier.\"},\"setHighTierAccount(address,bool)\":{\"notice\":\"Update high tier status of a given account.\"}},\"notice\":\"This contract acts as a placeholder for the real LDYStaking contract until this one is deployed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/DummyLDYStaking.sol\":\"LDYStaking\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/DummyLDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Ownable2Step} from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\\n * this one is deployed.\\n *\\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is Ownable2Step {\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /**\\n * @notice Update high tier status of a given account.\\n * @param account The account to update the high tier status of.\\n */\\n function setHighTierAccount(address account, bool status) public onlyOwner {\\n highTierAccounts[account] = status;\\n }\\n\\n /**\\n * @dev Dummy tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7be21f1a748fedb7b8b873230e24be45922e8bc09e87147b980a0a596e7550db\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b610096565b600180546001600160a01b031916905561004381610046602090811b6102bc17901c565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61042f806100a56000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c66120f41161005b578063c66120f4146100dc578063c8f74bb81461010f578063e30c397814610130578063f2fde38b1461014157600080fd5b80634c1fa4b91461008d578063715018a6146100a257806379ba5097146100aa5780638da5cb5b146100b2575b600080fd5b6100a061009b36600461039b565b610154565b005b6100a0610187565b6100a061019b565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6100ff6100ea3660046103d7565b60026020526000908152604090205460ff1681565b60405190151581526020016100d3565b61012261011d3660046103d7565b61021a565b6040519081526020016100d3565b6001546001600160a01b03166100bf565b6100a061014f3660046103d7565b61024b565b61015c61030c565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61018f61030c565b6101996000610366565b565b60015433906001600160a01b0316811461020e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61021781610366565b50565b6001600160a01b03811660009081526002602052604081205460ff161561024357506003919050565b506000919050565b61025361030c565b600180546001600160a01b0383166001600160a01b031990911681179091556102846000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146101995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610205565b600180546001600160a01b0319169055610217816102bc565b80356001600160a01b038116811461039657600080fd5b919050565b600080604083850312156103ae57600080fd5b6103b78361037f565b9150602083013580151581146103cc57600080fd5b809150509250929050565b6000602082840312156103e957600080fd5b6103f28261037f565b939250505056fea26469706673582212206538dd1589f64b8126522536a9b40ae8df1cd7f3b00b0c6919dcdbdbac49569f64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c66120f41161005b578063c66120f4146100dc578063c8f74bb81461010f578063e30c397814610130578063f2fde38b1461014157600080fd5b80634c1fa4b91461008d578063715018a6146100a257806379ba5097146100aa5780638da5cb5b146100b2575b600080fd5b6100a061009b36600461039b565b610154565b005b6100a0610187565b6100a061019b565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6100ff6100ea3660046103d7565b60026020526000908152604090205460ff1681565b60405190151581526020016100d3565b61012261011d3660046103d7565b61021a565b6040519081526020016100d3565b6001546001600160a01b03166100bf565b6100a061014f3660046103d7565b61024b565b61015c61030c565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61018f61030c565b6101996000610366565b565b60015433906001600160a01b0316811461020e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61021781610366565b50565b6001600160a01b03811660009081526002602052604081205460ff161561024357506003919050565b506000919050565b61025361030c565b600180546001600160a01b0383166001600160a01b031990911681179091556102846000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146101995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610205565b600180546001600160a01b0319169055610217816102bc565b80356001600160a01b038116811461039657600080fd5b919050565b600080604083850312156103ae57600080fd5b6103b78361037f565b9150602083013580151581146103cc57600080fd5b809150509250929050565b6000602082840312156103e957600080fd5b6103f28261037f565b939250505056fea26469706673582212206538dd1589f64b8126522536a9b40ae8df1cd7f3b00b0c6919dcdbdbac49569f64736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"highTierAccounts\",\"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\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setHighTierAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"tierOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"This contract only implements tierOf() function from LDYStaking as it's the only one the LToken contract relies on.\",\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"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.\"},\"setHighTierAccount(address,bool)\":{\"params\":{\"account\":\"The account to update the high tier status of.\"}},\"tierOf(address)\":{\"details\":\"Dummy tierOf() function that always return that the given account is not elligible to any LDY staking tier, except if the account is in the highTierAccounts mapping.\",\"params\":{\"account\":\"The account to check the tier of.\"}},\"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.\"}},\"stateVariables\":{\"highTierAccounts\":{\"details\":\"This is notably used to allow PreMining contracts to benefit from 0% withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\"}},\"title\":\"LDYStaking\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"highTierAccounts(address)\":{\"notice\":\"Holds a mapping of addresses that default to the highest staking tier.\"},\"setHighTierAccount(address,bool)\":{\"notice\":\"Update high tier status of a given account.\"}},\"notice\":\"This contract acts as a placeholder for the real LDYStaking contract until this one is deployed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/DummyLDYStaking.sol\":\"LDYStaking\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/DummyLDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Ownable2Step} from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\\n * this one is deployed.\\n *\\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is Ownable2Step {\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /**\\n * @notice Update high tier status of a given account.\\n * @param account The account to update the high tier status of.\\n */\\n function setHighTierAccount(address account, bool status) public onlyOwner {\\n highTierAccounts[account] = status;\\n }\\n\\n /**\\n * @dev Dummy tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7be21f1a748fedb7b8b873230e24be45922e8bc09e87147b980a0a596e7550db\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b610096565b600180546001600160a01b031916905561004381610046602090811b6102bc17901c565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61042f806100a56000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c66120f41161005b578063c66120f4146100dc578063c8f74bb81461010f578063e30c397814610130578063f2fde38b1461014157600080fd5b80634c1fa4b91461008d578063715018a6146100a257806379ba5097146100aa5780638da5cb5b146100b2575b600080fd5b6100a061009b36600461039b565b610154565b005b6100a0610187565b6100a061019b565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6100ff6100ea3660046103d7565b60026020526000908152604090205460ff1681565b60405190151581526020016100d3565b61012261011d3660046103d7565b61021a565b6040519081526020016100d3565b6001546001600160a01b03166100bf565b6100a061014f3660046103d7565b61024b565b61015c61030c565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61018f61030c565b6101996000610366565b565b60015433906001600160a01b0316811461020e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61021781610366565b50565b6001600160a01b03811660009081526002602052604081205460ff161561024357506003919050565b506000919050565b61025361030c565b600180546001600160a01b0383166001600160a01b031990911681179091556102846000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146101995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610205565b600180546001600160a01b0319169055610217816102bc565b80356001600160a01b038116811461039657600080fd5b919050565b600080604083850312156103ae57600080fd5b6103b78361037f565b9150602083013580151581146103cc57600080fd5b809150509250929050565b6000602082840312156103e957600080fd5b6103f28261037f565b939250505056fea2646970667358221220cc392651bd74dffe7810caf42d1c481cf091a52f937f7d46f7f82c6a277d10f964736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c66120f41161005b578063c66120f4146100dc578063c8f74bb81461010f578063e30c397814610130578063f2fde38b1461014157600080fd5b80634c1fa4b91461008d578063715018a6146100a257806379ba5097146100aa5780638da5cb5b146100b2575b600080fd5b6100a061009b36600461039b565b610154565b005b6100a0610187565b6100a061019b565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6100ff6100ea3660046103d7565b60026020526000908152604090205460ff1681565b60405190151581526020016100d3565b61012261011d3660046103d7565b61021a565b6040519081526020016100d3565b6001546001600160a01b03166100bf565b6100a061014f3660046103d7565b61024b565b61015c61030c565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61018f61030c565b6101996000610366565b565b60015433906001600160a01b0316811461020e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61021781610366565b50565b6001600160a01b03811660009081526002602052604081205460ff161561024357506003919050565b506000919050565b61025361030c565b600180546001600160a01b0383166001600160a01b031990911681179091556102846000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146101995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610205565b600180546001600160a01b0319169055610217816102bc565b80356001600160a01b038116811461039657600080fd5b919050565b600080604083850312156103ae57600080fd5b6103b78361037f565b9150602083013580151581146103cc57600080fd5b809150509250929050565b6000602082840312156103e957600080fd5b6103f28261037f565b939250505056fea2646970667358221220cc392651bd74dffe7810caf42d1c481cf091a52f937f7d46f7f82c6a277d10f964736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", diff --git a/contracts/hardhat/deployments/localhost/LTokenSignaler.json b/contracts/hardhat/deployments/localhost/LTokenSignaler.json index a9f23066..0e34f311 100644 --- a/contracts/hardhat/deployments/localhost/LTokenSignaler.json +++ b/contracts/hardhat/deployments/localhost/LTokenSignaler.json @@ -240,7 +240,7 @@ "transactionIndex": 0, "gasUsed": "332615", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000400000000000", - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927", + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b", "transactionHash": "0x0f8861522017b913a03fb6042639ed4b27740c20b210b6a14823edf3ebdccbd4", "logs": [ { @@ -254,7 +254,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927" + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b" }, { "transactionIndex": 0, @@ -266,7 +266,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927" + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b" } ], "blockNumber": 13, diff --git a/contracts/hardhat/deployments/localhost/LTokenSignaler_Implementation.json b/contracts/hardhat/deployments/localhost/LTokenSignaler_Implementation.json index 198e0980..8a96f819 100644 --- a/contracts/hardhat/deployments/localhost/LTokenSignaler_Implementation.json +++ b/contracts/hardhat/deployments/localhost/LTokenSignaler_Implementation.json @@ -213,7 +213,7 @@ "type": "function" } ], - "transactionHash": "0xc3c8146080dff66cbe3487f88b57925ea8e5f92793e505e73215e5441e20fc0f", + "transactionHash": "0x9f77a5580a29cb103472f762400e8282bff4b12706296d15ddae12b9290df6cd", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -221,20 +221,20 @@ "transactionIndex": 0, "gasUsed": "862865", "logsBloom": "0x00000000100000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x4ed1cef84d62586e8e3a4325d0375fe00a9d3e120200b76074ed6ba429b38f02", - "transactionHash": "0xc3c8146080dff66cbe3487f88b57925ea8e5f92793e505e73215e5441e20fc0f", + "blockHash": "0x2e98998b25ef10542d4ba9dbf9f07da603e58854159fd500a5edb2576063b3bd", + "transactionHash": "0x9f77a5580a29cb103472f762400e8282bff4b12706296d15ddae12b9290df6cd", "logs": [ { "transactionIndex": 0, "blockNumber": 12, - "transactionHash": "0xc3c8146080dff66cbe3487f88b57925ea8e5f92793e505e73215e5441e20fc0f", + "transactionHash": "0x9f77a5580a29cb103472f762400e8282bff4b12706296d15ddae12b9290df6cd", "address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0x4ed1cef84d62586e8e3a4325d0375fe00a9d3e120200b76074ed6ba429b38f02" + "blockHash": "0x2e98998b25ef10542d4ba9dbf9f07da603e58854159fd500a5edb2576063b3bd" } ], "blockNumber": 12, @@ -244,10 +244,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "1c94255f5edec71501da736e9b19ae5f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"LTokenSignalEvent\",\"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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"signalLToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Signal are ignored by the subgraph if the L-Token is already known by it.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LTokenSignalEvent(address)\":{\"params\":{\"lTokenAddress\":\"The address of the L-Token contract to signal.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"signalLToken(address)\":{\"params\":{\"lTokenAddress\":\"The address of the LToken contract to signal.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"LTokenSignaler\",\"version\":1},\"userdoc\":{\"events\":{\"LTokenSignalEvent(address)\":{\"notice\":\"Emitted to inform subgraph of the existence of a new L-Token contract.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"signalLToken(address)\":{\"notice\":\"Signals a LToken contract to the TheGraph subgraph of the current chain.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Used to inform subgraph from the existence of a new L-Token contract. Once signaled, a L-Token will start being indexed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LTokenSignaler.sol\":\"LTokenSignaler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/LTokenSignaler.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title LTokenSignaler\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\\n * signaled, a L-Token will start being indexed.\\n *\\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\\n * @param lTokenAddress The address of the L-Token contract to signal.\\n */\\n event LTokenSignalEvent(address indexed lTokenAddress);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\\n * @param lTokenAddress The address of the LToken contract to signal.\\n */\\n function signalLToken(address lTokenAddress) external onlyOwner {\\n // Signal the LToken contract\\n emit LTokenSignalEvent(lTokenAddress);\\n }\\n}\\n\",\"keccak256\":\"0xdfbd3364c76705fb67b72cdb405d6691a9b2e3cbcc0f3f783add6ac6cc855bd3\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2e610118600039600081816101b2015281816101fb0152818161029a015281816102da015261036d0152610e2e6000f3fe6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122068da0230acd1366802db80aa8fbec2cdf9b29855484e88bbd5526025431b168464736f6c63430008120033", - "deployedBytecode": "0x6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122068da0230acd1366802db80aa8fbec2cdf9b29855484e88bbd5526025431b168464736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"LTokenSignalEvent\",\"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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"globalOwner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lTokenAddress\",\"type\":\"address\"}],\"name\":\"signalLToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Signal are ignored by the subgraph if the L-Token is already known by it.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LTokenSignalEvent(address)\":{\"params\":{\"lTokenAddress\":\"The address of the L-Token contract to signal.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\"},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"initialize(address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"signalLToken(address)\":{\"params\":{\"lTokenAddress\":\"The address of the LToken contract to signal.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"LTokenSignaler\",\"version\":1},\"userdoc\":{\"events\":{\"LTokenSignalEvent(address)\":{\"notice\":\"Emitted to inform subgraph of the existence of a new L-Token contract.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Prevents implementation contract from being initialized as recommended by OpenZeppelin.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"initialize(address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"signalLToken(address)\":{\"notice\":\"Signals a LToken contract to the TheGraph subgraph of the current chain.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"}},\"notice\":\"Used to inform subgraph from the existence of a new L-Token contract. Once signaled, a L-Token will start being indexed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LTokenSignaler.sol\":\"LTokenSignaler\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/LTokenSignaler.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title LTokenSignaler\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\\n * signaled, a L-Token will start being indexed.\\n *\\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\\n * @param lTokenAddress The address of the L-Token contract to signal.\\n */\\n event LTokenSignalEvent(address indexed lTokenAddress);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\\n * @param lTokenAddress The address of the LToken contract to signal.\\n */\\n function signalLToken(address lTokenAddress) external onlyOwner {\\n // Signal the LToken contract\\n emit LTokenSignalEvent(lTokenAddress);\\n }\\n}\\n\",\"keccak256\":\"0xdfbd3364c76705fb67b72cdb405d6691a9b2e3cbcc0f3f783add6ac6cc855bd3\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610e2e610118600039600081816101b2015281816101fb0152818161029a015281816102da015261036d0152610e2e6000f3fe6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208e942a67b262e3e4d6c74e0c13d6a4884107cca285b9c45fe358ef9a40f0f40564736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100fd578063a69823dc1461012a578063c4d66de81461014a578063f2fde38b1461016a578063f762e7341461018a57600080fd5b80633659cfe61461008b5780634f1ef286146100ad57806352d1902d146100c0578063715018a6146100e8575b600080fd5b34801561009757600080fd5b506100ab6100a6366004610b2e565b6101a8565b005b6100ab6100bb366004610b61565b610290565b3480156100cc57600080fd5b506100d5610360565b6040519081526020015b60405180910390f35b3480156100f457600080fd5b506100ab610413565b34801561010957600080fd5b50610112610449565b6040516001600160a01b0390911681526020016100df565b34801561013657600080fd5b506100ab610145366004610b2e565b6104bc565b34801561015657600080fd5b506100ab610165366004610b2e565b6104fb565b34801561017657600080fd5b506100ab610185366004610b2e565b610615565b34801561019657600080fd5b5060c9546001600160a01b0316610112565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101f95760405162461bcd60e51b81526004016101f090610c25565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610242600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146102685760405162461bcd60e51b81526004016101f090610c71565b6102718161064a565b6040805160008082526020820190925261028d91839190610652565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102d85760405162461bcd60e51b81526004016101f090610c25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610321600080516020610db2833981519152546001600160a01b031690565b6001600160a01b0316146103475760405162461bcd60e51b81526004016101f090610c71565b6103508261064a565b61035c82826001610652565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104005760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016101f0565b50600080516020610db283398151915290565b61041b6107c2565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b60448201526064016101f0565b60c95460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190610cbd565b905090565b6104c46107c2565b6040516001600160a01b038216907f36c1488d5243eeaf5fb0cf28a35c54973316358b76e9c32ccbe2c57956b0879b90600090a250565b600054610100900460ff161580801561051b5750600054600160ff909116105b806105355750303b158015610535575060005460ff166001145b6105985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f0565b6000805460ff1916600117905580156105bb576000805461ff0019166101001790555b6105c482610823565b6105cc610853565b801561035c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61061d6107c2565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b60448201526064016101f0565b61028d6107c2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561068a576106858361087a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106e4575060408051601f3d908101601f191682019092526106e191810190610cda565b60015b6107475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016101f0565b600080516020610db283398151915281146107b65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016101f0565b50610685838383610916565b336107cb610449565b6001600160a01b0316146108215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f0565b565b600054610100900460ff1661084a5760405162461bcd60e51b81526004016101f090610cf3565b61028d81610941565b600054610100900460ff166108215760405162461bcd60e51b81526004016101f090610cf3565b6001600160a01b0381163b6108e75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101f0565b600080516020610db283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61091f8361098a565b60008251118061092c5750805b156106855761093b83836109ca565b50505050565b600054610100900460ff166109685760405162461bcd60e51b81526004016101f090610cf3565b60c980546001600160a01b0319166001600160a01b0392909216919091179055565b6109938161087a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606109ef8383604051806060016040528060278152602001610dd2602791396109f6565b9392505050565b6060600080856001600160a01b031685604051610a139190610d62565b600060405180830381855af49150503d8060008114610a4e576040519150601f19603f3d011682016040523d82523d6000602084013e610a53565b606091505b5091509150610a6486838387610a6e565b9695505050505050565b60608315610add578251600003610ad6576001600160a01b0385163b610ad65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f0565b5081610ae7565b610ae78383610aef565b949350505050565b815115610aff5781518083602001fd5b8060405162461bcd60e51b81526004016101f09190610d7e565b6001600160a01b038116811461028d57600080fd5b600060208284031215610b4057600080fd5b81356109ef81610b19565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610b7457600080fd5b8235610b7f81610b19565b9150602083013567ffffffffffffffff80821115610b9c57600080fd5b818501915085601f830112610bb057600080fd5b813581811115610bc257610bc2610b4b565b604051601f8201601f19908116603f01168101908382118183101715610bea57610bea610b4b565b81604052828152886020848701011115610c0357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215610ccf57600080fd5b81516109ef81610b19565b600060208284031215610cec57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015610d59578181015183820152602001610d41565b50506000910152565b60008251610d74818460208701610d3e565b9190910192915050565b6020815260008251806020840152610d9d816040850160208701610d3e565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208e942a67b262e3e4d6c74e0c13d6a4884107cca285b9c45fe358ef9a40f0f40564736f6c63430008120033", "devdoc": { "author": "Lila Rest (https://lila.rest)", "custom:security-contact": "security@ledgity.comsecurity@ledgity.com", @@ -402,15 +402,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 7770, + "astId": 7768, "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", "label": "_globalOwner", "offset": 0, "slot": "201", - "type": "t_contract(GlobalOwner)4973" + "type": "t_contract(GlobalOwner)4991" }, { - "astId": 7854, + "astId": 7852, "contract": "contracts/src/LTokenSignaler.sol:LTokenSignaler", "label": "__gap", "offset": 0, @@ -441,7 +441,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(GlobalOwner)4973": { + "t_contract(GlobalOwner)4991": { "encoding": "inplace", "label": "contract GlobalOwner", "numberOfBytes": "20" diff --git a/contracts/hardhat/deployments/localhost/LTokenSignaler_Proxy.json b/contracts/hardhat/deployments/localhost/LTokenSignaler_Proxy.json index 74cf15a7..c33d3a4b 100644 --- a/contracts/hardhat/deployments/localhost/LTokenSignaler_Proxy.json +++ b/contracts/hardhat/deployments/localhost/LTokenSignaler_Proxy.json @@ -79,7 +79,7 @@ "transactionIndex": 0, "gasUsed": "332615", "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000400000000000", - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927", + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b", "transactionHash": "0x0f8861522017b913a03fb6042639ed4b27740c20b210b6a14823edf3ebdccbd4", "logs": [ { @@ -93,7 +93,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927" + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b" }, { "transactionIndex": 0, @@ -105,7 +105,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x41438eb689a556c0af29d1c615cabb15982659b8ef0c3ec11f313ab5047be927" + "blockHash": "0x7e4bc6c3f3c903ac8bab1decc1cd3bbd6b38d7eef30f6d2b6cded4dfbc68714b" } ], "blockNumber": 13, diff --git a/contracts/hardhat/deployments/localhost/LUSDC.json b/contracts/hardhat/deployments/localhost/LUSDC.json index 9093a4fa..65871fc3 100644 --- a/contracts/hardhat/deployments/localhost/LUSDC.json +++ b/contracts/hardhat/deployments/localhost/LUSDC.json @@ -1333,7 +1333,7 @@ "transactionIndex": 0, "gasUsed": "652222", "logsBloom": "0x0000000000000000000000000000000040000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000400000000000000001000000000000000000000000000", - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132", + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4", "transactionHash": "0xec1c869bf0e186536e1800b5313b9282c47faf42885f2c0b8d4c9d6bdf7f67d8", "logs": [ { @@ -1347,7 +1347,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132" + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4" }, { "transactionIndex": 0, @@ -1359,7 +1359,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132" + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4" } ], "blockNumber": 11, diff --git a/contracts/hardhat/deployments/localhost/LUSDC_Implementation.json b/contracts/hardhat/deployments/localhost/LUSDC_Implementation.json index 76c1f3d3..1cb5b99a 100644 --- a/contracts/hardhat/deployments/localhost/LUSDC_Implementation.json +++ b/contracts/hardhat/deployments/localhost/LUSDC_Implementation.json @@ -1301,7 +1301,7 @@ "type": "function" } ], - "transactionHash": "0x71aa7b8fb12b1dc54da294650d3421aa12f0e4cd1b9a8a386f88f2c74f2db3e8", + "transactionHash": "0x0ebdb277c7b287121d05f956b0f37e09d29ed93619581aeb0479a5390a6a9619", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -1309,20 +1309,20 @@ "transactionIndex": 0, "gasUsed": "5364287", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000002000000000000000000000008400000000000000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x8e3479dc62b554c612a64ab167d05f222239d4205e480370f46394c79ad967b1", - "transactionHash": "0x71aa7b8fb12b1dc54da294650d3421aa12f0e4cd1b9a8a386f88f2c74f2db3e8", + "blockHash": "0x2a421c9e309648fb7008b7dc3ee014657087200d34405b940b66ce0b0e8cc050", + "transactionHash": "0x0ebdb277c7b287121d05f956b0f37e09d29ed93619581aeb0479a5390a6a9619", "logs": [ { "transactionIndex": 0, "blockNumber": 10, - "transactionHash": "0x71aa7b8fb12b1dc54da294650d3421aa12f0e4cd1b9a8a386f88f2c74f2db3e8", + "transactionHash": "0x0ebdb277c7b287121d05f956b0f37e09d29ed93619581aeb0479a5390a6a9619", "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0x8e3479dc62b554c612a64ab167d05f222239d4205e480370f46394c79ad967b1" + "blockHash": "0x2a421c9e309648fb7008b7dc3ee014657087200d34405b940b66ce0b0e8cc050" } ], "blockNumber": 10, @@ -1332,10 +1332,10 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "a268142553104e6d2a73dbd3773cf551", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newAPRUD7x3\",\"type\":\"uint16\"}],\"name\":\"APRChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"id\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum LToken.Action\",\"name\":\"action\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountAfterFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum LToken.Status\",\"name\":\"newStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"newId\",\"type\":\"int256\"}],\"name\":\"ActivityEvent\",\"type\":\"event\"},{\"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\":\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"}],\"name\":\"MintedRewardsEvent\",\"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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTVL\",\"type\":\"uint256\"}],\"name\":\"TVLChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"cancelWithdrawalRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feesRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"frozenRequests\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fund\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAPR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedRetained\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"getWithdrawnAmountAndFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"withdrawnAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalBlacklist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalPause\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"globalOwner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalPause_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalBlacklist_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ldyStaking_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"underlyingToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"instantWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"invested\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ldyStaking\",\"outputs\":[{\"internalType\":\"contract LDYStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"listenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"processBigQueuedRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processQueuedRequests\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"realBalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"realTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverUnderlying\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"repatriate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retentionRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardsRedirectsFromTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardsRedirectsToFrom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"aprUD7x3\",\"type\":\"uint16\"}],\"name\":\"setAPR\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"feesRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setFeesRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"fund_\",\"type\":\"address\"}],\"name\":\"setFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ldyStakingAddress\",\"type\":\"address\"}],\"name\":\"setLDYStaking\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"retentionRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setRetentionRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawer_\",\"type\":\"address\"}],\"name\":\"setWithdrawer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"startRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"stopRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalQueued\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transfersListeners\",\"outputs\":[{\"internalType\":\"contract ITransfersListener\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unclaimedFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"unlistenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unmintedRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usableUnderlyings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawalQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalQueueCursor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawer\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:oz-upgrades-unsafe-allow\":\"external-library-linking\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Definitions: - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio). - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees). - Instant: Processed immediately. - Request: Queued for later processing. - Big Request: A requested withdrawal exceeding half of the retention rate. - (Withdrawal) queue: A list of all requested withdrawals sorted by priority. - Request ID: The index of a withdrawal request in the queue array. - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain. - Fees Rate: Percentage of fees applied to successful withdrawals. - Usable underlyings: Amount of underlying tokens that have been deposited through expected ways and are so considered safe to use by the contract. - Transfers listeners: External contracts listening on L-Tokens transfers. - Fund wallet: Wallet managed by the Ledgity's financial team. - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request processing. Note that words between parenthesis are sometimes omitted for brevity.Deployment notice: This contract can safely receive funds immediately after initialization. (i.e., there is no way for funds to be sent to non-owned addresses). It is, however, recommended to replace ASAP owner and fund wallets with multi-sig wallets.For further details, see \\\"LToken\\\" section of whitepaper.\",\"events\":{\"APRChangeEvent(uint16)\":{\"params\":{\"newAPRUD7x3\":\"The new APR in UD7x3 format.\"}},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"params\":{\"account\":\"The account involved in the activity.\",\"action\":\"The type of activity.\",\"amount\":\"The amount of underlying tokens involved in the activity.\",\"id\":\"ID of the involved withdrawal request or NO_ID (-1) if not applicable.\",\"newId\":\"The new ID of the request if it has been moved in the queue.\",\"newStatus\":\"The new status of the activity.\"}},\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"params\":{\"account\":\"The account that received the rewards.\",\"balanceBefore\":\"The balance of the account before the minting.\",\"rewards\":\"The amount of minted rewards.\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"TVLChangeEvent(uint256)\":{\"details\":\"TVL = realTotalSupply()\",\"params\":{\"newTVL\":\"The new TVL of the contract.\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"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\":\"This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have not been yet minted to the specified account.\",\"params\":{\"account\":\"The account to check the total balance of.\"},\"returns\":{\"_0\":\"The total balance of the account.\"}},\"cancelWithdrawalRequest(uint256)\":{\"params\":{\"requestId\":\"The ID of the withdrawal request to cancel.\"}},\"decimals()\":{\"details\":\"The ERC20WrapperUpgradeable version is preferred because it mirrors the decimals amount of the underlying stablecoin token.\"},\"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`.\"},\"deposit(uint256)\":{\"params\":{\"amount\":\"The amount of underlying tokens to deposit.\"}},\"depositFor(address,uint256)\":{\"details\":\"Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\"},\"getAPR()\":{\"returns\":{\"_0\":\"The current APR in UD7x3 format.\"}},\"getExpectedRetained()\":{\"returns\":{\"amount\":\"The expected amount of retained underlying tokens.\"}},\"getWithdrawnAmountAndFees(address,uint256)\":{\"params\":{\"account\":\"The account initiating the withdrawal.\",\"amount\":\"The amount of the withdrawal.\"}},\"globalBlacklist()\":{\"returns\":{\"_0\":\"The address of the GlobalBlacklist contract.\"}},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"globalPause()\":{\"returns\":{\"_0\":\"The address of the GlobalPause contract.\"}},\"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,address,address,address,address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalBlacklist_\":\"The address of the GlobalBlacklist contract.\",\"globalOwner_\":\"The address of the GlobalOwner contract.\",\"globalPause_\":\"The address of the GlobalPause contract.\",\"underlyingToken\":\"The address of the underlying stablecoin ERC20 token.\"}},\"instantWithdrawal(uint256)\":{\"details\":\"In order to save some gas and time to users, frontends should propose this function to users only when it has been verified that it will not revert. They should propose the requestWithdrawal() function otherwise.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"invested()\":{\"returns\":{\"_0\":\"The reference to the invested token contract.\"}},\"listenToTransfers(address)\":{\"details\":\"Each time a transfer occurs, the onLTokenTransfer() function of the specified contract will be called.IMPORTANT SECURITY NOTE: This method is not intended to be used with contracts that are not owned by the Ledgity team.\",\"params\":{\"listenerContract\":\"The address of the new transfers listener contract.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"paused()\":{\"details\":\"Both version are the same as ERC20BaseUpgradeable.paused() mirrors GlobalPausableUpgradeable.paused(), so a random one is chosen.\",\"returns\":{\"_0\":\"Whether the contract is paused or not.\"}},\"processBigQueuedRequest(uint256)\":{\"details\":\"In contrast to non-big requests processing, this function will uses to fund wallet's balance to fill the request. This allows processing requests that are greater than retention rate without having to exceed this rate on the contract.\",\"params\":{\"requestId\":\"The ID of the big request to process.\"}},\"processQueuedRequests()\":{\"details\":\"For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"realBalanceOf(address)\":{\"params\":{\"account\":\"The account to check the real balance of.\"},\"returns\":{\"_0\":\"The real balance of the account.\"}},\"realTotalSupply()\":{\"returns\":{\"_0\":\"The real total supply of L-Tokens.\"}},\"recoverERC20(address,uint256)\":{\"details\":\"This override of RecoverableUpgradeable.recoverERC20() prevents the recovered token from being the underlying token.\",\"params\":{\"amount\":\"The amount of token to recover.\",\"tokenAddress\":\"The address of the token to recover.\"}},\"recoverUnderlying()\":{\"details\":\"To prevent owner from being able to drain the contract, this function only allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been sent through fund() or deposit() functions.\"},\"repatriate(uint256)\":{\"details\":\"The function will revert if repatriated amount makes the contract exceeding the retention rate.\",\"params\":{\"amount\":\"The amount of underlying tokens to repatriate.\"}},\"requestWithdrawal(uint256)\":{\"details\":\"The sender must attach 0.003 ETH to pre-pay the future processing gas fees paid by the withdrawer wallet.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"setAPR(uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\"}},\"setFeesRate(uint32)\":{\"params\":{\"feesRateUD7x3_\":\"The new withdrawal fee rate in UD7x3 format.\"}},\"setFund(address)\":{\"params\":{\"fund_\":\"The address of the new fund wallet.\"}},\"setLDYStaking(address)\":{\"params\":{\"ldyStakingAddress\":\"The address of the new LDYStaking contract.\"}},\"setRetentionRate(uint32)\":{\"details\":\"The retention rate is capped at 10%, which ensures that no more than 10% of deposited assets will ever be exposed in this contract (reduces attack surface).\",\"params\":{\"retentionRateUD7x3_\":\"The new retention rate in UD7x3 format.\"}},\"setWithdrawer(address)\":{\"params\":{\"withdrawer_\":\"The address of the new withdrawer wallet.\"}},\"startRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to redirect rewards from.\",\"to\":\"The address of the account to redirect rewards to.\"}},\"stopRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to stop redirecting rewards from.\",\"to\":\"The address of the account to stop redirecting rewards to.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply of L-Tokens.\"}},\"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`.\"},\"underlying()\":{\"details\":\"Returns the address of the underlying ERC-20 token that is being wrapped.\"},\"unlistenToTransfers(address)\":{\"details\":\"The onLTokenTransfer() function of the specified contract will not be called anymore each time a L-Token transfer occurs.\",\"params\":{\"listenerContract\":\"The address of the listener contract.\"}},\"unmintedRewardsOf(address)\":{\"details\":\"This is a public implementation of InvestUpgradeable_rewardsOf(). In the context of LToken, this function returns the amount of rewards that have not been distributed/minted yet to the specified account.This is particularly useful for off-chain services to display charts and statistics, as seen in the Ledgity Yield's frontend.\",\"params\":{\"account\":\"The account to check the unminted rewards of.\"},\"returns\":{\"_0\":\"The amount of account's unminted rewards.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawTo(address,uint256)\":{\"details\":\"Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\"}},\"stateVariables\":{\"frozenRequests\":{\"details\":\"If a request emitter as been blacklisted, its request is moved here to prevent it from blocking the queue.\"},\"transfersListeners\":{\"details\":\"onLTokenTransfer() functions of those contracts will be called on each transfer.\"},\"usableUnderlyings\":{\"details\":\"Are usable, only underlying tokens deposit through deposit() or fund() functions.\"}},\"title\":\"LToken\",\"version\":1},\"userdoc\":{\"events\":{\"APRChangeEvent(uint16)\":{\"notice\":\"Emitted to inform listeners about a change in the APR's value.\"},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"notice\":\"Emitted to inform listerners about an activity related to deposits and withdrawals.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"notice\":\"Emitted to inform listeners that some rewards have been minted.\"},\"TVLChangeEvent(uint256)\":{\"notice\":\"Emitted to inform listeners about a change in the contract's TVL.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address)\":{\"notice\":\"Retrieves the total balance of L-Tokens that belong to the account.\"},\"cancelWithdrawalRequest(uint256)\":{\"notice\":\"Cancels a given withdrawal request. The request emitter receive back its L-Tokens and no fees will be charged.\"},\"claimFees()\":{\"notice\":\"Used by owner to claim fees generated from successful withdrawals.\"},\"decimals()\":{\"notice\":\"Required override of decimals() which is implemented by both ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\"},\"deposit(uint256)\":{\"notice\":\"Allows exchanging some underlying tokens for the same amount of L-Tokens.\"},\"depositFor(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.depositFor() that reverts. Use deposit() function instead.\"},\"feesRateUD7x3()\":{\"notice\":\"Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\"},\"frozenRequests(uint256)\":{\"notice\":\"Holds a list of all currently frozen withdrawal requests.\"},\"fund()\":{\"notice\":\"Holds address of fund wallet (managed by Ledgity financial team).\"},\"getAPR()\":{\"notice\":\"Retrieves the most recently set APR.\"},\"getExpectedRetained()\":{\"notice\":\"Computes the maximum amount of underlying tokens that should be retained by the contract (based on retention rate).\"},\"getWithdrawnAmountAndFees(address,uint256)\":{\"notice\":\"Computes fees and net withdrawn amount for a given account withdrawing a given amount.\"},\"globalBlacklist()\":{\"notice\":\"Retrieves the address of GlobalBlacklist contract.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"globalPause()\":{\"notice\":\"Retrieves the address of GlobalPause contract.\"},\"initialize(address,address,address,address,address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"instantWithdrawal(uint256)\":{\"notice\":\"Allows instaneously exchanging a given amount of L-Tokens for the same amount of underlying tokens. It will fail if the contract currently doesn't hold enough underlying tokens to cover the withdrawal.\"},\"invested()\":{\"notice\":\"Retrieves the reference to the invested token contract.\"},\"ldyStaking()\":{\"notice\":\"Holds a reference to the LDYStaking contract.\"},\"listenToTransfers(address)\":{\"notice\":\"Adds a new contract to the L-Token transfers list.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"paused()\":{\"notice\":\"Required override of paused() which is implemented by both GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\"},\"processBigQueuedRequest(uint256)\":{\"notice\":\"Processes a given queued big withdrawal request (one that exceeds half of the retention rate).\"},\"processQueuedRequests()\":{\"notice\":\"Processes queued withdrawal requests until there is else no more requests, else not enough underlying tokens to continue.\"},\"realBalanceOf(address)\":{\"notice\":\"Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet minted/distributed rewards.\"},\"realTotalSupply()\":{\"notice\":\"Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"recoverERC20(address,uint256)\":{\"notice\":\"Recovers a specified amount of a given token address.\"},\"recoverUnderlying()\":{\"notice\":\"Recovers underlying tokens accidentally sent to the contract.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"repatriate(uint256)\":{\"notice\":\"Used by the fund wallet to repatriate underlying tokens on the contract whenever those are required to fulfill some withdrawal requests.\"},\"requestWithdrawal(uint256)\":{\"notice\":\"Allows requesting the exchange of a given amount of L-Tokens for the same amount of underlying tokens. The request will be automatically processed later.\"},\"retentionRateUD7x3()\":{\"notice\":\"Holds the retention rate in UD7x3 format.\"},\"rewardsRedirectsFromTo(address)\":{\"notice\":\"Holds active rewards redirections in both from->to and to->from[] ways.\"},\"setAPR(uint16)\":{\"notice\":\"Updates the investment APR. Restricted to owner.\"},\"setFeesRate(uint32)\":{\"notice\":\"Updates the current withdrawal fee rate.\"},\"setFund(address)\":{\"notice\":\"Updates the address of the fund wallet.\"},\"setLDYStaking(address)\":{\"notice\":\"Updates the address of LDYStaking contract.\"},\"setRetentionRate(uint32)\":{\"notice\":\"Updates the current underlying token retention rate.\"},\"setWithdrawer(address)\":{\"notice\":\"Updates the address of the withdrawer wallet.\"},\"startRewardsRedirection(address,address)\":{\"notice\":\"Enables redirection of rewards from one account to another.\"},\"stopRewardsRedirection(address,address)\":{\"notice\":\"Disable an active rewards redirection.\"},\"totalQueued()\":{\"notice\":\"Holds the amount of L-Tokens currently in the withdrawal queue.\"},\"totalSupply()\":{\"notice\":\"Retrives the total supply of L-Tokens, including not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transfersListeners(uint256)\":{\"notice\":\"Holds a list of contracts' references that are listening to L-Tokens transfers.\"},\"unclaimedFees()\":{\"notice\":\"Holds the amount of withdrawal fees not yet claimed by contract's owner.\"},\"unlistenToTransfers(address)\":{\"notice\":\"Removes a contract from the L-Token transfers list.\"},\"unmintedRewardsOf(address)\":{\"notice\":\"Retrieves the amount of given account's not yet minted rewards.\"},\"usableUnderlyings()\":{\"notice\":\"Holds the amount of underlying tokens considered as usable by the contract.\"},\"withdrawTo(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.withdrawTo() that reverts. Use instantWithdrawal() or requestWithdrawal() functions instead.\"},\"withdrawalQueue(uint256)\":{\"notice\":\"Holds an ordered list of active withdrawal requests.\"},\"withdrawalQueueCursor()\":{\"notice\":\"Holds the index of the next withdrawal request to process in the queue.\"},\"withdrawer()\":{\"notice\":\"Holds address of withdrawer wallet (managed by withdrawal server).\"}},\"notice\":\"Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e., investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin. As soon as a wallet holds some L-Tokens, it starts receiving rewards in the form of additional L-Tokens, which are auto-compounded over time.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LToken.sol\":\"LToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\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 /**\\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[45] private __gap;\\n}\\n\",\"keccak256\":\"0xd14a627157b9a411d2410713e5dd3a377e9064bd5c194a90748bbf27ea625784\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\\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\",\"keccak256\":\"0x0e1f0f5f62f67a881cd1a9597acbc0a5e4071f3c2c10449a183b922ae7272e3f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../../../security/PausableUpgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev ERC20 token with pausable token transfers, minting and burning.\\n *\\n * Useful for scenarios such as preventing trades until the end of an evaluation\\n * period, or having an emergency switch for freezing all token transfers in the\\n * event of a large bug.\\n *\\n * IMPORTANT: This contract does not include public pause and unpause functions. In\\n * addition to inheriting this contract, you must define both functions, invoking the\\n * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate\\n * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will\\n * make the contract unpausable.\\n */\\nabstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {\\n function __ERC20Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __ERC20Pausable_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {ERC20-_beforeTokenTransfer}.\\n *\\n * Requirements:\\n *\\n * - the contract must not be paused.\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n super._beforeTokenTransfer(from, to, amount);\\n\\n require(!paused(), \\\"ERC20Pausable: token transfer while paused\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xf0bd7f71ffae5f0addd375e8511fbf2ad8ca0c9b2606c32d92bdda7d76a7a81c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Wrapper.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Extension of the ERC20 token contract to support token wrapping.\\n *\\n * Users can deposit and withdraw \\\"underlying tokens\\\" and receive a matching number of \\\"wrapped tokens\\\". This is useful\\n * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the\\n * wrapping of an existing \\\"basic\\\" ERC20 into a governance token.\\n *\\n * _Available since v4.2._\\n *\\n * @custom:storage-size 51\\n */\\nabstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {\\n IERC20Upgradeable private _underlying;\\n\\n function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n __ERC20Wrapper_init_unchained(underlyingToken);\\n }\\n\\n function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n require(underlyingToken != this, \\\"ERC20Wrapper: cannot self wrap\\\");\\n _underlying = underlyingToken;\\n }\\n\\n /**\\n * @dev See {ERC20-decimals}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n try IERC20MetadataUpgradeable(address(_underlying)).decimals() returns (uint8 value) {\\n return value;\\n } catch {\\n return super.decimals();\\n }\\n }\\n\\n /**\\n * @dev Returns the address of the underlying ERC-20 token that is being wrapped.\\n */\\n function underlying() public view returns (IERC20Upgradeable) {\\n return _underlying;\\n }\\n\\n /**\\n * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\\n */\\n function depositFor(address account, uint256 amount) public virtual returns (bool) {\\n address sender = _msgSender();\\n require(sender != address(this), \\\"ERC20Wrapper: wrapper can't deposit\\\");\\n SafeERC20Upgradeable.safeTransferFrom(_underlying, sender, address(this), amount);\\n _mint(account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\\n */\\n function withdrawTo(address account, uint256 amount) public virtual returns (bool) {\\n _burn(_msgSender(), amount);\\n SafeERC20Upgradeable.safeTransfer(_underlying, account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal\\n * function that can be exposed with access control if desired.\\n */\\n function _recover(address account) internal virtual returns (uint256) {\\n uint256 value = _underlying.balanceOf(address(this)) - totalSupply();\\n _mint(account, value);\\n return value;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x14bb62a60fcbc911c33ac0e5456bf31ed50b502c30be46ee15bd3b698e91bd81\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.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 \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\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\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\\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\",\"keccak256\":\"0xd60f939a3ca0199014d079b4dd66aa757954334947d81eb5c1d35d7a83061ab3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../extensions/IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\\n * 0 before setting it to a non-zero value.\\n */\\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20PermitUpgradeable token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0x4dae161227d332808312ee2caf6384929321b83c16cc89b5642985fbec6b814c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/DummyLDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Ownable2Step} from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\\n * this one is deployed.\\n *\\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is Ownable2Step {\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /**\\n * @notice Update high tier status of a given account.\\n * @param account The account to update the high tier status of.\\n */\\n function setHighTierAccount(address account, bool status) public onlyOwner {\\n highTierAccounts[account] = status;\\n }\\n\\n /**\\n * @dev Dummy tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7be21f1a748fedb7b8b873230e24be45922e8bc09e87147b980a0a596e7550db\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/LToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {ERC20WrapperUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\\\";\\nimport \\\"./abstracts/base/ERC20BaseUpgradeable.sol\\\";\\nimport {InvestUpgradeable} from \\\"./abstracts/InvestUpgradeable.sol\\\";\\nimport {LDYStaking} from \\\"./DummyLDYStaking.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {SUD} from \\\"./libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport {ITransfersListener} from \\\"./interfaces/ITransfersListener.sol\\\";\\n\\n/**\\n * @title LToken\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\\n * the form of additional L-Tokens, which are auto-compounded over time.\\n *\\n * @dev Definitions:\\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\\n * - Instant: Processed immediately.\\n * - Request: Queued for later processing.\\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\\n * - Request ID: The index of a withdrawal request in the queue array.\\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\\n * expected ways and are so considered safe to use by the contract.\\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\\n * processing.\\n *\\n * Note that words between parenthesis are sometimes omitted for brevity.\\n *\\n * @dev Deployment notice:\\n * This contract can safely receive funds immediately after initialization. (i.e., there\\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\\n * replace ASAP owner and fund wallets with multi-sig wallets.\\n *\\n * @dev For further details, see \\\"LToken\\\" section of whitepaper.\\n * @custom:oz-upgrades-unsafe-allow external-library-linking\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /// @dev Represents type of actions triggering ActivityEvent events.\\n enum Action {\\n Deposit,\\n Withdraw\\n }\\n\\n /// @dev Represents different status of actions triggering ActivityEvent events.\\n enum Status {\\n Queued,\\n Cancelled,\\n Success,\\n Moved\\n }\\n\\n /**\\n * @notice Represents a withdrawal request in the queue.\\n * @dev A request fits in a single storage slot (32 bytes).\\n * @param account The account that initiated the request.\\n * @param amount The amount of underlying tokens requested.\\n */\\n struct WithdrawalRequest {\\n address account; // 20 bytes\\n uint96 amount; // 12 bytes\\n }\\n\\n /// @notice Upper limit of retention rate.\\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\\n\\n /// @notice Upper limit of fees rate.\\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\\n\\n /// @notice Used in activity events to represent the absence of request ID.\\n int256 private constant NO_ID = -1;\\n\\n /// @notice Holds a reference to the LDYStaking contract.\\n LDYStaking public ldyStaking;\\n\\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\\n address payable public withdrawer;\\n\\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\\n address public fund;\\n\\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\\n uint32 public feesRateUD7x3;\\n\\n /// @notice Holds the retention rate in UD7x3 format.\\n uint32 public retentionRateUD7x3;\\n\\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\\n uint256 public unclaimedFees;\\n\\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\\n uint256 public totalQueued;\\n\\n /**\\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\\n */\\n uint256 public usableUnderlyings;\\n\\n /// @notice Holds an ordered list of active withdrawal requests.\\n WithdrawalRequest[] public withdrawalQueue;\\n\\n /// @notice Holds the index of the next withdrawal request to process in the queue.\\n uint256 public withdrawalQueueCursor;\\n\\n /**\\n * @notice Holds a list of all currently frozen withdrawal requests.\\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\\n * it from blocking the queue.\\n */\\n WithdrawalRequest[] public frozenRequests;\\n\\n /**\\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\\n */\\n ITransfersListener[] public transfersListeners;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the contract's TVL.\\n * @dev TVL = realTotalSupply()\\n * @param newTVL The new TVL of the contract.\\n */\\n event TVLChangeEvent(uint256 newTVL);\\n\\n /**\\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\\n * @param account The account involved in the activity.\\n * @param action The type of activity.\\n * @param amount The amount of underlying tokens involved in the activity.\\n * @param newStatus The new status of the activity.\\n * @param newId The new ID of the request if it has been moved in the queue.\\n */\\n event ActivityEvent(\\n int256 indexed id,\\n address indexed account,\\n Action indexed action,\\n uint256 amount,\\n uint256 amountAfterFees,\\n Status newStatus,\\n int256 newId\\n );\\n\\n /**\\n * @notice Emitted to inform listeners that some rewards have been minted.\\n * @param account The account that received the rewards.\\n * @param balanceBefore The balance of the account before the minting.\\n * @param rewards The amount of minted rewards.\\n */\\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\\n\\n /// @notice Reverts if the function caller is not the withdrawer wallet.\\n modifier onlyWithdrawer() {\\n require(_msgSender() == withdrawer, \\\"L39\\\");\\n _;\\n }\\n\\n /// @notice Reverts if the function caller is not the fund wallet.\\n modifier onlyFund() {\\n require(_msgSender() == fund, \\\"L40\\\");\\n _;\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\\n */\\n function initialize(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address ldyStaking_,\\n address underlyingToken\\n ) public initializer {\\n // Initialize ERC20 base.\\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\\n __ERC20Base_init(\\n globalOwner_,\\n globalPause_,\\n globalBlacklist_,\\n string(abi.encodePacked(\\\"Ledgity \\\", underlyingSymbol)),\\n string(abi.encodePacked(\\\"L\\\", underlyingSymbol))\\n );\\n\\n // IMPORTANT: Below calls must not be restricted to owner at any point.\\n // This is because the GlobalOwner contract may not be a fresh one, and so\\n // the contract deployer may not be the owner anymore after ERC20Base init.\\n\\n // Initialize other parents contracts.\\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\\n __Invest_init_unchained(address(this));\\n\\n // Set LDYStaking contract\\n ldyStaking = LDYStaking(ldyStaking_);\\n\\n // Set initial withdrawal fees rate to 0.3%\\n feesRateUD7x3 = 300;\\n\\n // Set initial retention rate to 10%\\n retentionRateUD7x3 = 10_000;\\n\\n // Default withdrawer and fund wallet to contract owner address. This prevents\\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\\n withdrawer = payable(owner());\\n fund = payable(owner());\\n }\\n\\n /**\\n * @notice Required override of decimals() which is implemented by both\\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\\n * decimals amount of the underlying stablecoin token.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function decimals()\\n public\\n view\\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\\n returns (uint8)\\n {\\n return ERC20WrapperUpgradeable.decimals();\\n }\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @notice Updates the current withdrawal fee rate.\\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\\n */\\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \\\"L88\\\");\\n feesRateUD7x3 = feesRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the current underlying token retention rate.\\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\\n * deposited assets will ever be exposed in this contract (reduces attack surface).\\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\\n */\\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \\\"L41\\\");\\n retentionRateUD7x3 = retentionRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the address of LDYStaking contract.\\n * @param ldyStakingAddress The address of the new LDYStaking contract.\\n */\\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\\n ldyStaking = LDYStaking(ldyStakingAddress);\\n }\\n\\n /**\\n * @notice Updates the address of the withdrawer wallet.\\n * @param withdrawer_ The address of the new withdrawer wallet.\\n */\\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\\n // Ensure address is not the zero address (pre-processing fees would be lost else)\\n require(withdrawer_ != address(0), \\\"L63\\\");\\n\\n // Set new withdrawer wallet's address\\n withdrawer = withdrawer_;\\n }\\n\\n /**\\n * @notice Updates the address of the fund wallet.\\n * @param fund_ The address of the new fund wallet.\\n */\\n function setFund(address payable fund_) public onlyOwner {\\n // Ensure address is not the zero address (deposited tokens would be lost else)\\n require(fund_ != address(0), \\\"L64\\\");\\n\\n // Set new fund wallet's address\\n fund = fund_;\\n }\\n\\n /**\\n * @notice Adds a new contract to the L-Token transfers list.\\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\\n * specified contract will be called.\\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\\n * contracts that are not owned by the Ledgity team.\\n * @param listenerContract The address of the new transfers listener contract.\\n */\\n function listenToTransfers(address listenerContract) public onlyOwner {\\n transfersListeners.push(ITransfersListener(listenerContract));\\n }\\n\\n /**\\n * @notice Removes a contract from the L-Token transfers list.\\n * @dev The onLTokenTransfer() function of the specified contract will not be called\\n * anymore each time a L-Token transfer occurs.\\n * @param listenerContract The address of the listener contract.\\n */\\n function unlistenToTransfers(address listenerContract) public onlyOwner {\\n // Find index of listener contract in transferListeners array\\n int256 index = -1;\\n uint256 transfersListenersLength = transfersListeners.length;\\n for (uint256 i = 0; i < transfersListenersLength; i++) {\\n if (address(transfersListeners[i]) == listenerContract) {\\n index = int256(i);\\n break;\\n }\\n }\\n\\n // Revert if given contract wasn't listening to transfers\\n require(index > -1, \\\"L42\\\");\\n\\n // Else, remove transfers listener contract from listeners array\\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\\n transfersListeners.pop();\\n }\\n\\n /**\\n * @notice Retrieves the amount of given account's not yet minted rewards.\\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\\n * context of LToken, this function returns the amount of rewards that have not been\\n * distributed/minted yet to the specified account.\\n * @dev This is particularly useful for off-chain services to display charts and\\n * statistics, as seen in the Ledgity Yield's frontend.\\n * @param account The account to check the unminted rewards of.\\n * @return The amount of account's unminted rewards.\\n */\\n function unmintedRewardsOf(address account) public view returns (uint256) {\\n return _rewardsOf(account, true);\\n }\\n\\n /**\\n * @notice Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet\\n * minted/distributed rewards.\\n * @param account The account to check the real balance of.\\n * @return The real balance of the account.\\n */\\n function realBalanceOf(address account) public view returns (uint256) {\\n return super.balanceOf(account);\\n }\\n\\n /**\\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\\n * not been yet minted to the specified account.\\n * @param account The account to check the total balance of.\\n * @return The total balance of the account.\\n */\\n function balanceOf(address account) public view override returns (uint256) {\\n return realBalanceOf(account) + unmintedRewardsOf(account);\\n }\\n\\n /**\\n * @notice Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet\\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\\n * @return The real total supply of L-Tokens.\\n */\\n function realTotalSupply() public view returns (uint256) {\\n return super.totalSupply();\\n }\\n\\n /**\\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\\n * fees and L-Tokens currently in the withdrawal queue.\\n * @return The total supply of L-Tokens.\\n */\\n function totalSupply() public view override returns (uint256) {\\n return realTotalSupply() + totalQueued + unclaimedFees;\\n }\\n\\n /**\\n * @notice Recovers a specified amount of a given token address.\\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\\n * token from being the underlying token.\\n * @inheritdoc RecoverableUpgradeable\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\\n // Ensure the token is not the underlying token\\n require(tokenAddress != address(underlying()), \\\"L43\\\");\\n\\n // Proceed to recovery\\n super.recoverERC20(tokenAddress, amount);\\n }\\n\\n /**\\n * @notice Recovers underlying tokens accidentally sent to the contract.\\n * @dev To prevent owner from being able to drain the contract, this function only\\n * allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been\\n * sent through fund() or deposit() functions.\\n */\\n function recoverUnderlying() external onlyOwner {\\n // Compute the recoverable amount by taking the difference between the contract's\\n // balance and the amount of usable underlying tokens\\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\\n\\n // Revert if there is nothing to recover\\n require(recoverableAmount > 0, \\\"L44\\\");\\n\\n // Else, proceed to underlying tokens recovery\\n super.recoverERC20(address(underlying()), recoverableAmount);\\n }\\n\\n /**\\n * @notice Retrieves the amount of underlying tokens invested by the given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\\n * LToken contract, the investment of an account is equal to its real balance.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _investmentOf(address account) internal view override returns (uint256) {\\n return realBalanceOf(account);\\n }\\n\\n /**\\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract so\\n * it can distribute rewards to accounts before each period reset.\\n * @dev InvestUpgradeable contract already ensure that amount > 0.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\\n // Inform listeners of the rewards minting\\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\\n\\n // Mint L-Tokens rewards to account\\n _mint(account, amount);\\n\\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\\n return true;\\n }\\n\\n /**\\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\\n * called each time an account's balance is going to change.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\\n * @inheritdoc ERC20BaseUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\\n\\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\\n if (from != address(0)) _beforeInvestmentChange(from, true);\\n if (to != address(0)) _beforeInvestmentChange(to, true);\\n }\\n\\n /**\\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\\n * transfers listeners.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already checked in _beforeTokenTransfer().\\n * @inheritdoc ERC20Upgradeable\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n // If some L-Token have been burned/minted, inform listeners of a TVL change\\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\\n\\n // Trigger onLTokenTransfer() functions of all the transfers listeners\\n for (uint256 i = 0; i < transfersListeners.length; i++) {\\n transfersListeners[i].onLTokenTransfer(from, to, amount);\\n }\\n }\\n\\n /**\\n * @notice Computes the maximum amount of underlying tokens that should be retained\\n * by the contract (based on retention rate).\\n * @return amount The expected amount of retained underlying tokens.\\n */\\n function getExpectedRetained() public view returns (uint256 amount) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert totalSupply and retentionRate to SUD\\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\\n\\n // Compute and return expected retained amount\\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(expectedRetainedSUD, d);\\n }\\n\\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\\n function _transferExceedingToFund() internal {\\n // Retrieve the expected amount retained\\n uint256 expectedRetained = getExpectedRetained();\\n\\n // If usable underlyings are less than or equal to expected retained, return\\n if (usableUnderlyings <= expectedRetained) return;\\n\\n // Else, exceeding amount is equal to difference between those values\\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= exceedingAmount;\\n\\n // Transfer the exceeding amount to the fund wallet\\n underlying().safeTransfer(fund, exceedingAmount);\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L45\\\");\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\\n * Use deposit() function instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L46\\\");\\n }\\n\\n /**\\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\\n * @param amount The amount of underlying tokens to deposit.\\n */\\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough underlying tokens to deposit\\n require(underlying().balanceOf(_msgSender()) >= amount, \\\"L47\\\");\\n\\n // Update usable underlyings balance accordingly\\n usableUnderlyings += amount;\\n\\n // Inform listeners of the deposit activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Deposit,\\n amount,\\n amount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\\n super.depositFor(_msgSender(), amount);\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\\n * given amount.\\n * @param account The account initiating the withdrawal.\\n * @param amount The amount of the withdrawal.\\n */\\n function getWithdrawnAmountAndFees(\\n address account,\\n uint256 amount\\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\\n // If the account is eligible to staking tier 2, no fees are applied\\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\\n\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert amount and fees rate to SUD\\n uint256 amountSUD = SUD.fromAmount(amount, d);\\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\\n\\n // Compute fees and withdrawn amount (initial amount minus fees)\\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\\n fees = SUD.toAmount(feesSUD, d);\\n withdrawnAmount = amount - fees;\\n }\\n\\n /**\\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\\n * enough underlying tokens to cover the withdrawal.\\n * @dev In order to save some gas and time to users, frontends should propose this\\n * function to users only when it has been verified that it will not revert. They\\n * should propose the requestWithdrawal() function otherwise.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L48\\\");\\n\\n // Can the contract cover this withdrawal plus all already queued requests?\\n bool cond1 = totalQueued + amount <= usableUnderlyings;\\n\\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\\n\\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\\n if (!(cond1 || cond2)) revert(\\\"L49\\\");\\n\\n // Else, retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\\n\\n // Increase unclaimed fees amount accordingly\\n unclaimedFees += fees;\\n\\n // Decrease usable underlyings balance accordingly\\n usableUnderlyings -= withdrawnAmount;\\n\\n // Inform listeners of this instant withdrawal activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Burn withdrawal fees from the account\\n _burn(_msgSender(), fees);\\n\\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\\n super.withdrawTo(_msgSender(), withdrawnAmount);\\n }\\n\\n /**\\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\\n * amount of underlying tokens. The request will be automatically processed later.\\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\\n * paid by the withdrawer wallet.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function requestWithdrawal(\\n uint256 amount\\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L53\\\");\\n\\n // Ensure the requested amount doesn't overflow uint96\\n require(amount <= type(uint96).max, \\\"L54\\\");\\n\\n // Ensure the sender attached the pre-paid processing gas fees\\n require(msg.value == 0.003 * 10 ** 18, \\\"L55\\\");\\n\\n // Create withdrawal request data\\n WithdrawalRequest memory request = WithdrawalRequest({\\n account: _msgSender(),\\n amount: uint96(amount)\\n });\\n\\n // Will hold the request ID\\n uint256 requestId;\\n\\n // Append request to the withdrawal queue:\\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\\n withdrawalQueueCursor--;\\n requestId = withdrawalQueueCursor;\\n withdrawalQueue[requestId] = request;\\n }\\n // - At the end else\\n else {\\n withdrawalQueue.push(request);\\n requestId = withdrawalQueue.length - 1;\\n }\\n\\n // Increase total amount queued accordingly\\n totalQueued += amount;\\n\\n // Inform listeners of this new queued withdrawal activity event\\n emit ActivityEvent(\\n int256(requestId),\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n amount,\\n Status.Queued,\\n NO_ID\\n );\\n\\n // Burn withdrawal L-Tokens amount from account's balance\\n _burn(_msgSender(), amount);\\n\\n // Forward pre-paid processing gas fees to the withdrawer wallet\\n (bool sent, ) = withdrawer.call{value: msg.value}(\\\"\\\");\\n require(sent, \\\"L56\\\");\\n }\\n\\n /**\\n * @notice Processes queued withdrawal requests until there is else no more requests,\\n * else not enough underlying tokens to continue.\\n * @dev For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\\n */\\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\\n // Accumulators variables, will be written on-chain after the loop\\n uint256 cumulatedFees = 0;\\n uint256 cumulatedWithdrawnAmount = 0;\\n uint256 nextRequestId = withdrawalQueueCursor;\\n\\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\\n // requests are increasing the queue length when moved at the end of the queue.\\n uint256 queueLength = withdrawalQueue.length;\\n\\n // Iterate over requests to be processed\\n while (nextRequestId < queueLength) {\\n // Stop processing requests if there is not enough gas left to continue the\\n // loop and properly end the function call. This prevents an attacker from\\n // blocking the withdrawal processing by creating a ton of tiny requests so\\n // this function call cannot fit anymore in block gas limit.\\n if (gasleft() < 45000) break;\\n\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\\n\\n // Skip empty request (processed big requests or cancelled requests)\\n if (request.account == address(0)) {}\\n //\\n // If account has been blacklisted since request emission\\n else if (isBlacklisted(request.account)) {\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request in the frozen requests list\\n frozenRequests.push(request);\\n }\\n //\\n // Or if request is a big request, move it at the end of the queue for now.\\n // This request will be processed manually later using processBigQueuedRequest()\\n else if (request.amount > getExpectedRetained() / 2) {\\n // Inform listeners of this queued request being moved at the end of the queue\\n emit ActivityEvent(\\n int256(nextRequestId),\\n _msgSender(),\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Moved,\\n int256(withdrawalQueue.length)\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request at the end of the queue\\n withdrawalQueue.push(request);\\n }\\n //\\n // Else, continue request processing\\n else {\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Break if the contract doesn't hold enough funds to cover the request\\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\\n\\n // Accumulate fees and withdrawn amount\\n cumulatedFees += fees;\\n cumulatedWithdrawnAmount += withdrawnAmount;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(nextRequestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Transfer underlying tokens to account. Burning L-Tokens is not required\\n // as equestWithdrawal() already did it.\\n // Security note: Re-entrancy warning are disabled as the request has\\n // just been deleted from the queue, it will so be skipped if trying to\\n // process it again.\\n // slither-disable-next-line reentrancy-no-eth\\n underlying().safeTransfer(request.account, withdrawnAmount);\\n }\\n\\n // Increment next request ID\\n nextRequestId++;\\n }\\n\\n // Increase unclaimed fees by the amount of cumulated fees\\n unclaimedFees += cumulatedFees;\\n\\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\\n usableUnderlyings -= cumulatedWithdrawnAmount;\\n\\n // Decrease total amount queued by the cumulated amount requested\\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\\n\\n // Update new queue cursor\\n withdrawalQueueCursor = nextRequestId;\\n\\n // Retention rate cannot exceeds as the withdrawal decreases both usable\\n // underlyings and expected retained amounts by the same number and as the\\n // expected retained amount is a subset of usable underlyings amount.\\n }\\n\\n /**\\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\\n * the retention rate).\\n * @dev In contrast to non-big requests processing, this function will uses to fund\\n * wallet's balance to fill the request. This allows processing requests that are\\n * greater than retention rate without having to exceed this rate on the contract.\\n * @param requestId The ID of the big request to process.\\n */\\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure the request is active\\n require(request.account != address(0), \\\"L66\\\");\\n\\n // Ensure the request emitter has not been blacklisted since request emission\\n require(!isBlacklisted(request.account), \\\"L50\\\");\\n\\n // Ensure this is indeed a big request\\n require(request.amount > getExpectedRetained() / 2, \\\"L51\\\");\\n\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\\n uint256 fundBalance = underlying().balanceOf(fund);\\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \\\"L52\\\");\\n\\n // Increase amount of unclaimed fees accordingly\\n unclaimedFees += fees;\\n\\n // Decrease total queued amount by request amount\\n totalQueued -= request.amount;\\n\\n // Increment queue cursor if request was the next request to be processed\\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[requestId];\\n\\n // If fund wallet's balance can cover request, rely on it only\\n if (withdrawnAmount <= fundBalance) {\\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\\n }\\n // Else, cover request from both fund wallet and contract balances\\n else {\\n // Compute amount missing from fund wallet to cover request\\n uint256 missingAmount = withdrawnAmount - fundBalance;\\n\\n // Decrease usable amount of underlying tokens accordingly\\n usableUnderlyings -= missingAmount;\\n\\n // Transfer entire fund balance to request's emitter\\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\\n\\n // Transfer missing amount from contract balance to request emitter\\n underlying().safeTransfer(request.account, missingAmount);\\n }\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Cancels a given withdrawal request. The request emitter receive back its\\n * L-Tokens and no fees will be charged.\\n * @param requestId The ID of the withdrawal request to cancel.\\n */\\n function cancelWithdrawalRequest(\\n uint256 requestId\\n ) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure request belongs to caller\\n require(_msgSender() == request.account, \\\"L57\\\");\\n\\n // Decrease total amount queued accordingly\\n totalQueued -= request.amount;\\n\\n // Delete the withdrawal request from queue\\n delete withdrawalQueue[requestId];\\n\\n // Inform listeners of this cancelled withdrawal request activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Cancelled,\\n NO_ID\\n );\\n\\n // Mint back L-Tokens to account\\n _mint(request.account, uint256(request.amount));\\n }\\n\\n /**\\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\\n * whenever those are required to fulfill some withdrawal requests.\\n * @dev The function will revert if repatriated amount makes the contract exceeding\\n * the retention rate.\\n * @param amount The amount of underlying tokens to repatriate.\\n */\\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\\n // Ensure the fund wallet has enough funds to repatriate\\n require(amount <= underlying().balanceOf(fund), \\\"L58\\\");\\n\\n // Calculate new contract usable balance\\n uint256 newBalance = usableUnderlyings + amount;\\n\\n // Ensure the new balance doesn't exceed the retention rate\\n require(newBalance <= getExpectedRetained(), \\\"L59\\\");\\n\\n // Increase usable underlyings amount by repatriated amount\\n usableUnderlyings += amount;\\n\\n // Transfer amount from fund wallet to contract\\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\\n }\\n\\n /// @notice Used by owner to claim fees generated from successful withdrawals.\\n function claimFees() external onlyOwner {\\n // Ensure there are some fees to claim\\n require(unclaimedFees > 0, \\\"L60\\\");\\n\\n // Ensure the contract holds enough underlying tokens to cover fees\\n require(usableUnderlyings >= unclaimedFees, \\\"L61\\\");\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= unclaimedFees;\\n\\n // Store fees amount in memory and reset unclaimed fees amount\\n uint256 fees = unclaimedFees;\\n unclaimedFees = 0;\\n\\n // Transfer unclaimed fees to owner\\n underlying().safeTransfer(owner(), fees);\\n }\\n}\\n\",\"keccak256\":\"0x60644fd9d32b09ccadb2a138a53cbbca7aa12b312a3b5bcaec8579a1a5a49972\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalPausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalPause} from \\\"../GlobalPause.sol\\\";\\n\\n/**\\n * @title GlobalPausableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\\n * contract (see GlobalPause.sol). This design facilitates centralized management of\\n * pause state for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure\\n * The _globalPause state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalPausableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\\n /**\\n * @notice The GlobalPause contract the pause state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalPause private _globalPause;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalPause_ The address of the GlobalPause contract.\\n */\\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n }\\n\\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\\n _globalPause = GlobalPause(globalPause_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalPause contract.\\n * @return The address of the GlobalPause contract.\\n */\\n function globalPause() public view returns (address) {\\n return address(_globalPause);\\n }\\n\\n /**\\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\\n * from the GlobalPause contract instead.\\n * @return Whether the contract is paused or not.\\n */\\n function paused() public view virtual override returns (bool) {\\n return _globalPause.paused();\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xff508c0b8c48916885453b4894d0401e94580fb24fb6af1885a3e160864cde94\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalRestrictableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalBlacklist} from \\\"../GlobalBlacklist.sol\\\";\\n\\n/**\\n * @title GlobalRestrictableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a blacklist state from the specified\\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\\n * centralized management of a blacklist for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalBlacklist state must be set at initialization time and, for evident\\n * security reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalRestrictableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalRestrictableUpgradeable is Initializable {\\n /**\\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalBlacklist private _globalBlacklist;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n }\\n\\n function __GlobalRestrictable_init_unchained(\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalBlacklist contract.\\n * @return The address of the GlobalBlacklist contract.\\n */\\n function globalBlacklist() public view returns (address) {\\n return address(_globalBlacklist);\\n }\\n\\n /**\\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n */\\n modifier notBlacklisted(address account) {\\n require(isBlacklisted(account) == false, \\\"L9\\\");\\n _;\\n }\\n\\n /**\\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n * @return Whether the account is blacklisted.\\n */\\n function isBlacklisted(address account) internal view returns (bool) {\\n return _globalBlacklist.isBlacklisted(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x0032fde90d9cf23e70dd4b604ae0d1ed3283f117bc24f68d32f8933e1bd372bc\",\"license\":\"MIT\"},\"contracts/src/abstracts/InvestUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"./GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"./GlobalRestrictableUpgradeable.sol\\\";\\nimport \\\"./base/BaseUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../abstracts/RecoverableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {APRHistory as APRH} from \\\"../libs/APRHistory.sol\\\";\\nimport {SUD} from \\\"../libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title InvestUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with utilities to manage an invested token,\\n * users' investment periods, rewards calculations, virtual balances, and auto-compounding.\\n *\\n * @dev Intuition:\\n * This contract primarily exists for code splitting and reusability. It unburdens the\\n * LToken contract code, making it easier to understand and maintain.\\n *\\n * This contract is generic because it may be used in the LDYStaking contract in the future.\\n *\\n * @dev Definitions:\\n * - Investment: The act of depositing or investing tokens into the contract.\\n * - Investment period: Time between the last invested amount change and the present.\\n * - Virtual balance: Temporary storage for account rewards, used when those can't be\\n * distributed between investment periods.\\n * - Rewards redirection: Mechanism allowing an account to redirect its rewards to another.\\n *\\n * @dev Derived contract must:\\n * - Set invested token during initialization\\n * - Implement _investmentOf() function\\n * - (optionally) Implement _distributeRewards() function\\n *\\n * @dev For further details, see \\\"InvestmentUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract InvestUpgradeable is BaseUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n using APRH for APRH.Pack[];\\n\\n /**\\n * @notice Represents an account's investment period.\\n * @param timestamp The timestamp of the most recent rewards distribution.\\n * @param ref The reference of the last APR checkpoint at that timestamp.\\n */\\n struct InvestmentPeriod {\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n APRH.Reference ref;\\n }\\n\\n /**\\n * @notice Represents the investment details of an account.\\n * @param period The current investment period of the account.\\n * @param virtualBalance May hold a part of account rewards until they are claimed.\\n */\\n struct AccountDetails {\\n InvestmentPeriod period;\\n uint256 virtualBalance;\\n }\\n\\n /// @notice Holds a reference to the invested token's contract.\\n IERC20Upgradeable private _invested;\\n\\n /// @notice Holds investment details of each account.\\n mapping(address => AccountDetails) internal accountsDetails;\\n\\n /// @notice Holds an history of the APR value over time (see APRHistory.sol).\\n APRH.Pack[] private _aprHistory;\\n\\n /// @notice Holds active rewards redirections in both from->to and to->from[] ways.\\n mapping(address => address) public rewardsRedirectsFromTo;\\n mapping(address => address[]) public rewardsRedirectsToFrom;\\n\\n /// @notice Is used to prevent infinite loop in _beforeInvestmentChange().\\n bool private _isClaiming;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the APR's value.\\n * @param newAPRUD7x3 The new APR in UD7x3 format.\\n */\\n event APRChangeEvent(uint16 newAPRUD7x3);\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param invested_ The address of the invested token contract.\\n */\\n function __Invest_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address invested_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __Invest_init_unchained(invested_);\\n }\\n\\n function __Invest_init_unchained(address invested_) internal onlyInitializing {\\n // Set invested token\\n _invested = IERC20Upgradeable(invested_);\\n\\n // Define initial APR to 0%. This would prevent getAPR() from reverting because\\n // of an empty APR history\\n _aprHistory.setAPR(0);\\n }\\n\\n /**\\n * @notice Retrieves the reference to the invested token contract.\\n * @return The reference to the invested token contract.\\n */\\n function invested() public view returns (IERC20Upgradeable) {\\n return _invested;\\n }\\n\\n /**\\n * @notice Updates the investment APR. Restricted to owner.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(uint16 aprUD7x3) public onlyOwner {\\n _aprHistory.setAPR(aprUD7x3);\\n emit APRChangeEvent(aprUD7x3);\\n }\\n\\n /**\\n * @notice Retrieves the most recently set APR.\\n * @return The current APR in UD7x3 format.\\n */\\n function getAPR() public view returns (uint16) {\\n return _aprHistory.getAPR();\\n }\\n\\n /**\\n * @notice Enables redirection of rewards from one account to another.\\n * @param from The address of the account to redirect rewards from.\\n * @param to The address of the account to redirect rewards to.\\n */\\n function startRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure the address is not already redirecting rewards\\n require(rewardsRedirectsFromTo[from] == address(0), \\\"L62\\\");\\n\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L12\\\");\\n require(to != address(0), \\\"L13\\\");\\n\\n // Ensure 'from' and 'to' addresses are distinct\\n require(from != to, \\\"L14\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L15\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Activate rewards redirection\\n rewardsRedirectsFromTo[from] = to;\\n rewardsRedirectsToFrom[to].push(from);\\n }\\n\\n /**\\n * @notice Disable an active rewards redirection.\\n * @param from The address of the account to stop redirecting rewards from.\\n * @param to The address of the account to stop redirecting rewards to.\\n */\\n function stopRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L16\\\");\\n require(to != address(0), \\\"L17\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L18\\\");\\n\\n // Ensure a rewards redirection was active\\n require(rewardsRedirectsFromTo[from] == to, \\\"L19\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Retrieve 'from' index in the redirection array of 'to'\\n int256 fromIndex = -1;\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[to].length; i++) {\\n if (rewardsRedirectsToFrom[to][i] == from) {\\n fromIndex = int256(i);\\n break;\\n }\\n }\\n\\n // fromIndex should never be -1 at this point\\n assert(fromIndex >= 0);\\n\\n // Deactivate rewards redirection\\n rewardsRedirectsFromTo[from] = address(0);\\n rewardsRedirectsToFrom[to][uint256(fromIndex)] = rewardsRedirectsToFrom[to][\\n rewardsRedirectsToFrom[to].length - 1\\n ];\\n rewardsRedirectsToFrom[to].pop();\\n }\\n\\n /**\\n * @notice Retrieves the total amount of tokens invested by the given account.\\n * @dev Derived contracts must implement this function.\\n * @param account The account to get the investment of.\\n * @return The total amount of tokens invested by the given account.\\n */\\n function _investmentOf(address account) internal view virtual returns (uint256);\\n\\n /**\\n * @notice Distributes a specified amount of rewards to a given account.\\n * @dev Derived contracts may optionally implement this function.\\n * @dev Implementations must return true to indicate a successful distribution, and\\n * false otherwise. If it returns false, the rewards will be added to the account's\\n * virtual balance, in order to be claimed later.\\n * @param account The account to claim the rewards of.\\n * @param amount The amount of rewards to claim.\\n * @return Whether the rewards distribution was successfull.\\n */\\n function _distributeRewards(address account, uint256 amount) internal virtual returns (bool) {\\n account; // Silence unused variables warning\\n amount;\\n return false;\\n }\\n\\n /**\\n * @notice Computes the rewards accrued over a specified period of time, based on a\\n * given APR and amount of invested tokens.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param beginTimestamp The moment the period commenced.\\n * @param endTimestamp The moment the period concluded.\\n * @param aprUD7x3 The APR during this period, in UD7x3 format.\\n * @param investedAmount The amount of tokens deposited/invested during the period.\\n * @return The amount of rewards generated during the period.\\n */\\n function _calculatePeriodRewards(\\n uint40 beginTimestamp,\\n uint40 endTimestamp,\\n uint16 aprUD7x3,\\n uint256 investedAmount\\n ) internal view returns (uint256) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Compute the number of elapsed years\\n uint256 elapsedTimeSUD = SUD.fromInt(endTimestamp - beginTimestamp, d);\\n uint256 elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1, d)) / SUD.fromInt(365 days, d);\\n\\n // Compute the growth in invested amount (thanks to rewards)\\n uint256 aprSUD = SUD.fromRate(aprUD7x3, d);\\n uint256 growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1, d);\\n\\n // Compute and return the rewards\\n uint256 investedAmountSUD = SUD.fromAmount(investedAmount, d);\\n uint256 rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(rewardsSUD, d);\\n }\\n\\n /**\\n * @notice Computes the sum of given account's invested amount, plus invested amount\\n * of all accounts that recursively redirect rewards to this account.\\n * @param account The account to calculate the deep investment of.\\n * @return deepInvestedAmount The deep invested amount.\\n */\\n function _deepInvestmentOf(address account) internal view returns (uint256 deepInvestedAmount) {\\n // Consider account's direct investment\\n deepInvestedAmount += _investmentOf(account);\\n\\n // But also the deep investments of all accounts redirecting rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n deepInvestedAmount += _deepInvestmentOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Computes the amount of unclaimed/undistributed rewards of a given account.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param account The account to calculate the unclaimed rewards of.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n * @return rewards The amount of unclaimed/undistributed rewards of the given account.\\n */\\n function _rewardsOf(\\n address account,\\n bool autocompound\\n ) internal view returns (uint256 rewards) {\\n // Retrieve account's investment details\\n AccountDetails memory details = accountsDetails[account];\\n\\n // Retrieve account's deep invested amount\\n uint256 investedAmount = _deepInvestmentOf(account);\\n\\n // Return 0 if the account has never invested or has no invested amount\\n if (details.period.timestamp == 0 || investedAmount == 0) return 0;\\n\\n // Retrieve reference and data of APR checkpoint at which started investment period\\n APRH.Reference memory currRef = details.period.ref;\\n APRH.CheckpointData memory currCheckpoint = _aprHistory.getDataFromReference(currRef);\\n\\n // Retrieve reference of latest APR checkpoint\\n APRH.Reference memory latestRef = _aprHistory.getLatestReference();\\n\\n // 1) Fill rewards with virtual balance (rewards not claimed/distributed yet)\\n // See \\\"InvestUpgradeable > Yield calculation > 1)\\\" section of the whitepaper\\n rewards = details.virtualBalance;\\n\\n // If start checkpoint is not the latest one\\n if (!APRH.eq(currRef, latestRef)) {\\n // Retrieve reference and data of APR checkpoint that comes after start checkpoint\\n APRH.Reference memory nextRef = APRH.incrementReference(currRef);\\n APRH.CheckpointData memory nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // 2) Calculate rewards from investment period start to next checkpoint\\n // See \\\"InvestUpgradeable > Yield calculation > 2)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n\\n // 3) Calculate rewards for each crossed pair of checkpoints\\n // See \\\"InvestUpgradeable > Yield calculation > 3)\\\" section of the whitepaper\\n while (true) {\\n // Set next checkpoint as the current one\\n currRef = nextRef;\\n currCheckpoint = nextCheckpoint;\\n\\n // Break if current checkpoint is the latest one\\n if (APRH.eq(currRef, latestRef)) break;\\n\\n // Else, retrieve the new next checkpoint\\n nextRef = APRH.incrementReference(currRef);\\n nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // Calculate rewards between the current pair of checkpoints\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n\\n // 4) Calculate rewards from the latest checkpoint to now\\n // See \\\"InvestUpgradeable > Yield calculation > 4)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n } else {\\n // 2.bis) Calculate rewards from investment period start to now\\n // See \\\"InvestUpgradeable > Yield calculation > 2.bis)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n }\\n\\n /**\\n * @notice Recursively resets the investment period of the specified account and of\\n * all accounts that directly or indirectly redirect rewards to this account.\\n * @param account The account to deeply reset the investment period of.\\n */\\n function _deepResetInvestmentPeriodOf(address account) internal {\\n // Reset account investment period timestamp and APR checkpoint to latest ones\\n accountsDetails[account].period.timestamp = uint40(block.timestamp);\\n accountsDetails[account].period.ref = _aprHistory.getLatestReference();\\n\\n // Also reset the ones of all accounts that recursively redirect rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n _deepResetInvestmentPeriodOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Hook to be invoked before the invested amount of an account changes. It\\n * ensures that rewards are distributed and that account's investment period is reset.\\n * @param account The account whose invested amount is going to change.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n */\\n function _beforeInvestmentChange(address account, bool autocompound) internal {\\n // This hook is called inside LToken._beforeTokenTransfer() and as new tokens are\\n // minted in LToken._distributeRewards(), this guards against infinite loop.\\n if (_isClaiming) return;\\n\\n // LToken._beforeTokenTransfer() calls this hook for both involved addresses.\\n // As first call will treat both addresses, the second call would be redundant.\\n // Therefore, we skip accounts already processed in this block to save up some gas.\\n if (accountsDetails[account].period.timestamp == uint40(block.timestamp)) return;\\n\\n // If account redirects its rewards\\n address redirectRewardsTo = rewardsRedirectsFromTo[account];\\n if (redirectRewardsTo != address(0)) {\\n // Call hook on redirection target (this will indirectly reset the investment\\n // of this source account) and return\\n _beforeInvestmentChange(redirectRewardsTo, autocompound);\\n return;\\n }\\n\\n // Else, compute account's undistributed/unclaimed rewards\\n uint256 rewards = _rewardsOf(account, autocompound);\\n\\n // If there are some rewards\\n if (rewards > 0) {\\n // Try to distribute rewards to account\\n _isClaiming = true;\\n bool distributed = _distributeRewards(account, rewards);\\n _isClaiming = false;\\n\\n // If rewards have not been distributed, accumulate them in account's virtual balance\\n if (!distributed) accountsDetails[account].virtualBalance = rewards;\\n }\\n\\n // Finally, deeply reset investment period of the account\\n _deepResetInvestmentPeriodOf(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xdb6d0b0e2f2546b6be0ac9244e99017c5e5da1e5b7783d6fff50f4217b9ec820\",\"license\":\"MIT\"},\"contracts/src/abstracts/RecoverableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Conracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title RecoverableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with helper functions allowing the recovery of\\n * assets accidentally sent to them.\\n *\\n * @dev Where are utilities Ether, ERC721, etc.?\\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\\n * in this codebase currently do not implement the necessary functions to receive Ether\\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\\n *\\n * @dev For further details, see \\\"RecoverableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init(globalOwner_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Recoverable_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Recovers a specified amount of a given token address. Will fail if the\\n * contract doesn't hold enough tokens.\\n * @param tokenAddress The address of the token to recover.\\n * @param amount The amount of token to recover.\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\\n // Ensure the specified amount is not zero\\n require(amount > 0, \\\"L10\\\");\\n\\n // Create a reference to token's contract\\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\\n\\n // Ensure there is enough token to recover\\n require(tokenContract.balanceOf(address(this)) >= amount, \\\"L11\\\");\\n\\n // Transfer the recovered token amount to the sender\\n tokenContract.safeTransfer(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xc70110d1284c9e4aa7c518b3b98682dd9edbe6f6fb23761d825554ba41a80d5e\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"../GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"../GlobalRestrictableUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../RecoverableUpgradeable.sol\\\";\\n\\n/**\\n * @title BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\\n * minimizing code repetition and enhancing readability and maintainability.\\n *\\n * @dev For further details, see \\\"Base\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract BaseUpgradeable is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n GlobalPausableUpgradeable,\\n GlobalRestrictableUpgradeable,\\n RecoverableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xe445c759682f31d39e63663ff8217072c0e81086bda11ea473247be334c3e424\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/ERC20BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\nimport {ERC20PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"./BaseUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\n\\n/**\\n * @title ERC20BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract is an extension of BaseUpgradeable intended to be used\\n * as a base for ERC20 tokens contracts.\\n *\\n * @dev For further details, see \\\"ERC20BaseUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract ERC20BaseUpgradeable is\\n ERC20Upgradeable,\\n BaseUpgradeable,\\n ERC20PausableUpgradeable\\n{\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param name_ The display name of the token.\\n * @param symbol_ The symbol of the token.\\n */\\n function __ERC20Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __ERC20_init(name_, symbol_);\\n __ERC20Pausable_init_unchained();\\n }\\n\\n function __ERC20Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and PausableUpgradeable parent contracts.\\n * The GlobalPausableUpgradeable version is preferred because it checks the pause\\n * state from the GlobalPause contract.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, PausableUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @dev Required override of _beforeTokenTransfer() which is implemented by both\\n * ERC20PausableUpgradeable and ERC20Upgradeable parent contracts.\\n * The ERC20PausableUpgradeable version is preferred because it also checks that\\n * the contract is not paused before allowing the transfer.\\n * @inheritdoc ERC20PausableUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n )\\n internal\\n virtual\\n override(ERC20PausableUpgradeable, ERC20Upgradeable)\\n whenNotPaused\\n notBlacklisted(from)\\n notBlacklisted(to)\\n {\\n ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xa69b9acca2902fcfe513889516fcffc830903fc3c6a3a11e2ad8da7460201378\",\"license\":\"MIT\"},\"contracts/src/interfaces/ITransfersListener.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\ninterface ITransfersListener {\\n function onLTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0xf1d4172da97ccaf7199601dd9bdb2ac92a49b6977ec34bba010af37f662549fb\",\"license\":\"MIT\"},\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"},\"contracts/src/libs/SUD.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title SUD\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice SUD serves as an intermediary number format for calculations within this\\n * codebase. It ensures consistency and reduces precision losses. This library\\n * facilitates conversions between various number formats and the SUD format.\\n *\\n * @dev Intuition:\\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\\n * represent both percentage rates and tokens amounts.\\n *\\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\\n * the decimals() value of the involved tokens.\\n *\\n * Three challenges arise from this:\\n * 1) To compute values together, it's essential that they are in the same format\\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\\n * precision loss (because division shrinks). A common approach is to scale up and\\n * down values by a few decimals before and after performing calculations.\\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\\n * be shrunk in case token's decimals number is in [0, 2].\\n *\\n * To address these challenges, this library provides the SUD format, which acts as a\\n * consistent and scaled intermediate format to perform calculations.\\n *\\n * SUD is an acronym for either \\\"Scaled UD\\\" or \\\"Safe UD\\\".\\n *\\n * @dev Definitions:\\n * - Integer: A number without fractional part, e.g., block.timestamp\\n * - UD: A decimal unsigned fixed-point number. The \\\"UD\\\" notation is inspired from\\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\\n * and fractional parts (as token amounts have variable decimal numbers)\\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\\n * with 3 more decimals than the involved UD with the highest decimals number. As\\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\\n * so ranges from UD71x6 to UD0x77 formats.\\n *\\n * @dev A conversion library:\\n * This library provides utilities to perform the following conversions:\\n * - Amount <--> SUD\\n * - Rate (UD7x3) <--> SUD\\n * - Integer <--> SUD\\n *\\n * @dev Why scaling by 3 decimals?\\n * - It provides an adequate degree of precision for this codebase,\\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\\n * the involved token's decimal number, so is gas efficient.\\n *\\n * @dev Why internal functions?\\n * The functions of this library are not set to external because incorporating them\\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\\n * from making them external are negated by the additional bytecode required for external\\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\\n * when those functions's visibility is set to external or internal.\\n *\\n * @dev Precision warning:\\n * While this library mitigates precision loss during calculations on UD numbers, it's\\n * important to note that tokens with lower decimal counts and supply inherently suffer\\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\\n * will experience less precision loss.\\n *\\n * @dev For further details, see \\\"SUD\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary SUD {\\n /**\\n * @notice Retrieves decimals number of the given ERC20 contract address.\\n * @param tokenAddress The address to retrieve decimals number from.\\n * @return decimals The decimals number of the given ERC20 contract address.\\n */\\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\\n }\\n\\n /**\\n * @notice Convert a given token amount into SUD format.\\n * @param nAmount The token amount to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The amount in SUD format\\n */\\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\\n\\n // Else return a number with decimals+3 fractional digits\\n return nAmount * 10 ** 3;\\n }\\n\\n /**\\n * @notice Convert a given SUD number into token amount format.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nAmount The number in amount format\\n */\\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** 3;\\n }\\n\\n /**\\n * @notice Converts a given UD7x3 rate into SUD format.\\n * @param nUD7x3 The UD7x3 rate to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The rate in SUD format.\\n */\\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nUD7x3 * 10 ** 3;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return nUD7x3 * 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given SUD number into a UD7x3 rate.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nUD7x3 The number in UD7x3 rate format.\\n */\\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 3;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given integer into SUD format.\\n * @param n The integer to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The integer in SUD format.\\n */\\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return n * 10 ** 6;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return n * 10 ** (decimals + 3);\\n }\\n\\n /**\\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return n The SUD number as an integer.\\n */\\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 6;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** (decimals + 3);\\n }\\n}\\n\",\"keccak256\":\"0x7297fc67064b5925e26fa5ed3a4ba4b0f64a9162fdf0ebc2aac8649fddce543a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051615f916200011f60003960008181611462015281816114a2015281816118fd0152818161193d01526119d00152615f916000f3fe6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff82166024820152730165878A594ca255338adfa4d48449f69242Eb8F9063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b81526102906004820152600090730165878A594ca255338adfa4d48449f69242Eb8F9063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b8152610290600482015260006024820152730165878A594ca255338adfa4d48449f69242Eb8F9063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b8152600090730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b81526102906004820152909150600090730165878A594ca255338adfa4d48449f69242Eb8F90630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b905084602001519550730165878A594ca255338adfa4d48449f69242Eb8F634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b8152600090730165878A594ca255338adfa4d48449f69242Eb8F90637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b8152909150600090730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b819450809350730165878A594ca255338adfa4d48449f69242Eb8F634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b8152730165878A594ca255338adfa4d48449f69242Eb8F90637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b8152909250730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b81526102906004820152730165878A594ca255338adfa4d48449f69242Eb8F90630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a264697066735822122075fca9467f2456a5739b6b2931262fe9508bbdbfb6838b51523f93bfbd0daa9764736f6c63430008120033", - "deployedBytecode": "0x6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff8216602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b8152610290600482015260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b815261029060048201526000602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b8152610290600482015290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b90508460200151955073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b815290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b81945080935073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b815273__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b815290925073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b8152610290600482015273__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a264697066735822122075fca9467f2456a5739b6b2931262fe9508bbdbfb6838b51523f93bfbd0daa9764736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newAPRUD7x3\",\"type\":\"uint16\"}],\"name\":\"APRChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"id\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum LToken.Action\",\"name\":\"action\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountAfterFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum LToken.Status\",\"name\":\"newStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"newId\",\"type\":\"int256\"}],\"name\":\"ActivityEvent\",\"type\":\"event\"},{\"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\":\"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\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"}],\"name\":\"MintedRewardsEvent\",\"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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTVL\",\"type\":\"uint256\"}],\"name\":\"TVLChangeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"cancelWithdrawalRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feesRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"frozenRequests\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fund\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAPR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedRetained\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"getWithdrawnAmountAndFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"withdrawnAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalBlacklist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalPause\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"globalOwner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalPause_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"globalBlacklist_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ldyStaking_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"underlyingToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"instantWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"invested\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ldyStaking\",\"outputs\":[{\"internalType\":\"contract LDYStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"listenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"processBigQueuedRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processQueuedRequests\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"realBalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"realTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverUnderlying\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"repatriate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retentionRateUD7x3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardsRedirectsFromTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardsRedirectsToFrom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"aprUD7x3\",\"type\":\"uint16\"}],\"name\":\"setAPR\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"feesRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setFeesRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"fund_\",\"type\":\"address\"}],\"name\":\"setFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ldyStakingAddress\",\"type\":\"address\"}],\"name\":\"setLDYStaking\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"retentionRateUD7x3_\",\"type\":\"uint32\"}],\"name\":\"setRetentionRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawer_\",\"type\":\"address\"}],\"name\":\"setWithdrawer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"startRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"stopRewardsRedirection\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalQueued\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transfersListeners\",\"outputs\":[{\"internalType\":\"contract ITransfersListener\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unclaimedFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerContract\",\"type\":\"address\"}],\"name\":\"unlistenToTransfers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"unmintedRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usableUnderlyings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawalQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalQueueCursor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawer\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Lila Rest (https://lila.rest)\",\"custom:oz-upgrades-unsafe-allow\":\"external-library-linking\",\"custom:security-contact\":\"security@ledgity.comsecurity@ledgity.com\",\"details\":\"Definitions: - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio). - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees). - Instant: Processed immediately. - Request: Queued for later processing. - Big Request: A requested withdrawal exceeding half of the retention rate. - (Withdrawal) queue: A list of all requested withdrawals sorted by priority. - Request ID: The index of a withdrawal request in the queue array. - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain. - Fees Rate: Percentage of fees applied to successful withdrawals. - Usable underlyings: Amount of underlying tokens that have been deposited through expected ways and are so considered safe to use by the contract. - Transfers listeners: External contracts listening on L-Tokens transfers. - Fund wallet: Wallet managed by the Ledgity's financial team. - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request processing. Note that words between parenthesis are sometimes omitted for brevity.Deployment notice: This contract can safely receive funds immediately after initialization. (i.e., there is no way for funds to be sent to non-owned addresses). It is, however, recommended to replace ASAP owner and fund wallets with multi-sig wallets.For further details, see \\\"LToken\\\" section of whitepaper.\",\"events\":{\"APRChangeEvent(uint16)\":{\"params\":{\"newAPRUD7x3\":\"The new APR in UD7x3 format.\"}},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"params\":{\"account\":\"The account involved in the activity.\",\"action\":\"The type of activity.\",\"amount\":\"The amount of underlying tokens involved in the activity.\",\"id\":\"ID of the involved withdrawal request or NO_ID (-1) if not applicable.\",\"newId\":\"The new ID of the request if it has been moved in the queue.\",\"newStatus\":\"The new status of the activity.\"}},\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"params\":{\"account\":\"The account that received the rewards.\",\"balanceBefore\":\"The balance of the account before the minting.\",\"rewards\":\"The amount of minted rewards.\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"TVLChangeEvent(uint256)\":{\"details\":\"TVL = realTotalSupply()\",\"params\":{\"newTVL\":\"The new TVL of the contract.\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"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\":\"This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have not been yet minted to the specified account.\",\"params\":{\"account\":\"The account to check the total balance of.\"},\"returns\":{\"_0\":\"The total balance of the account.\"}},\"cancelWithdrawalRequest(uint256)\":{\"params\":{\"requestId\":\"The ID of the withdrawal request to cancel.\"}},\"decimals()\":{\"details\":\"The ERC20WrapperUpgradeable version is preferred because it mirrors the decimals amount of the underlying stablecoin token.\"},\"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`.\"},\"deposit(uint256)\":{\"params\":{\"amount\":\"The amount of underlying tokens to deposit.\"}},\"depositFor(address,uint256)\":{\"details\":\"Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\"},\"getAPR()\":{\"returns\":{\"_0\":\"The current APR in UD7x3 format.\"}},\"getExpectedRetained()\":{\"returns\":{\"amount\":\"The expected amount of retained underlying tokens.\"}},\"getWithdrawnAmountAndFees(address,uint256)\":{\"params\":{\"account\":\"The account initiating the withdrawal.\",\"amount\":\"The amount of the withdrawal.\"}},\"globalBlacklist()\":{\"returns\":{\"_0\":\"The address of the GlobalBlacklist contract.\"}},\"globalOwner()\":{\"returns\":{\"_0\":\"The address of the GlobalOwner contract.\"}},\"globalPause()\":{\"returns\":{\"_0\":\"The address of the GlobalPause contract.\"}},\"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,address,address,address,address)\":{\"details\":\"See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\",\"params\":{\"globalBlacklist_\":\"The address of the GlobalBlacklist contract.\",\"globalOwner_\":\"The address of the GlobalOwner contract.\",\"globalPause_\":\"The address of the GlobalPause contract.\",\"underlyingToken\":\"The address of the underlying stablecoin ERC20 token.\"}},\"instantWithdrawal(uint256)\":{\"details\":\"In order to save some gas and time to users, frontends should propose this function to users only when it has been verified that it will not revert. They should propose the requestWithdrawal() function otherwise.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"invested()\":{\"returns\":{\"_0\":\"The reference to the invested token contract.\"}},\"listenToTransfers(address)\":{\"details\":\"Each time a transfer occurs, the onLTokenTransfer() function of the specified contract will be called.IMPORTANT SECURITY NOTE: This method is not intended to be used with contracts that are not owned by the Ledgity team.\",\"params\":{\"listenerContract\":\"The address of the new transfers listener contract.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner\"}},\"paused()\":{\"details\":\"Both version are the same as ERC20BaseUpgradeable.paused() mirrors GlobalPausableUpgradeable.paused(), so a random one is chosen.\",\"returns\":{\"_0\":\"Whether the contract is paused or not.\"}},\"processBigQueuedRequest(uint256)\":{\"details\":\"In contrast to non-big requests processing, this function will uses to fund wallet's balance to fill the request. This allows processing requests that are greater than retention rate without having to exceed this rate on the contract.\",\"params\":{\"requestId\":\"The ID of the big request to process.\"}},\"processQueuedRequests()\":{\"details\":\"For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"realBalanceOf(address)\":{\"params\":{\"account\":\"The account to check the real balance of.\"},\"returns\":{\"_0\":\"The real balance of the account.\"}},\"realTotalSupply()\":{\"returns\":{\"_0\":\"The real total supply of L-Tokens.\"}},\"recoverERC20(address,uint256)\":{\"details\":\"This override of RecoverableUpgradeable.recoverERC20() prevents the recovered token from being the underlying token.\",\"params\":{\"amount\":\"The amount of token to recover.\",\"tokenAddress\":\"The address of the token to recover.\"}},\"recoverUnderlying()\":{\"details\":\"To prevent owner from being able to drain the contract, this function only allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been sent through fund() or deposit() functions.\"},\"repatriate(uint256)\":{\"details\":\"The function will revert if repatriated amount makes the contract exceeding the retention rate.\",\"params\":{\"amount\":\"The amount of underlying tokens to repatriate.\"}},\"requestWithdrawal(uint256)\":{\"details\":\"The sender must attach 0.003 ETH to pre-pay the future processing gas fees paid by the withdrawer wallet.\",\"params\":{\"amount\":\"The amount L-Tokens to withdraw.\"}},\"setAPR(uint16)\":{\"params\":{\"aprUD7x3\":\"The new APR in UD7x3 format.\"}},\"setFeesRate(uint32)\":{\"params\":{\"feesRateUD7x3_\":\"The new withdrawal fee rate in UD7x3 format.\"}},\"setFund(address)\":{\"params\":{\"fund_\":\"The address of the new fund wallet.\"}},\"setLDYStaking(address)\":{\"params\":{\"ldyStakingAddress\":\"The address of the new LDYStaking contract.\"}},\"setRetentionRate(uint32)\":{\"details\":\"The retention rate is capped at 10%, which ensures that no more than 10% of deposited assets will ever be exposed in this contract (reduces attack surface).\",\"params\":{\"retentionRateUD7x3_\":\"The new retention rate in UD7x3 format.\"}},\"setWithdrawer(address)\":{\"params\":{\"withdrawer_\":\"The address of the new withdrawer wallet.\"}},\"startRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to redirect rewards from.\",\"to\":\"The address of the account to redirect rewards to.\"}},\"stopRewardsRedirection(address,address)\":{\"params\":{\"from\":\"The address of the account to stop redirecting rewards from.\",\"to\":\"The address of the account to stop redirecting rewards to.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply of L-Tokens.\"}},\"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`.\"},\"underlying()\":{\"details\":\"Returns the address of the underlying ERC-20 token that is being wrapped.\"},\"unlistenToTransfers(address)\":{\"details\":\"The onLTokenTransfer() function of the specified contract will not be called anymore each time a L-Token transfer occurs.\",\"params\":{\"listenerContract\":\"The address of the listener contract.\"}},\"unmintedRewardsOf(address)\":{\"details\":\"This is a public implementation of InvestUpgradeable_rewardsOf(). In the context of LToken, this function returns the amount of rewards that have not been distributed/minted yet to the specified account.This is particularly useful for off-chain services to display charts and statistics, as seen in the Ledgity Yield's frontend.\",\"params\":{\"account\":\"The account to check the unminted rewards of.\"},\"returns\":{\"_0\":\"The amount of account's unminted rewards.\"}},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdrawTo(address,uint256)\":{\"details\":\"Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\"}},\"stateVariables\":{\"frozenRequests\":{\"details\":\"If a request emitter as been blacklisted, its request is moved here to prevent it from blocking the queue.\"},\"transfersListeners\":{\"details\":\"onLTokenTransfer() functions of those contracts will be called on each transfer.\"},\"usableUnderlyings\":{\"details\":\"Are usable, only underlying tokens deposit through deposit() or fund() functions.\"}},\"title\":\"LToken\",\"version\":1},\"userdoc\":{\"events\":{\"APRChangeEvent(uint16)\":{\"notice\":\"Emitted to inform listeners about a change in the APR's value.\"},\"ActivityEvent(int256,address,uint8,uint256,uint256,uint8,int256)\":{\"notice\":\"Emitted to inform listerners about an activity related to deposits and withdrawals.\"},\"MintedRewardsEvent(address,uint256,uint256)\":{\"notice\":\"Emitted to inform listeners that some rewards have been minted.\"},\"TVLChangeEvent(uint256)\":{\"notice\":\"Emitted to inform listeners about a change in the contract's TVL.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address)\":{\"notice\":\"Retrieves the total balance of L-Tokens that belong to the account.\"},\"cancelWithdrawalRequest(uint256)\":{\"notice\":\"Cancels a given withdrawal request. The request emitter receive back its L-Tokens and no fees will be charged.\"},\"claimFees()\":{\"notice\":\"Used by owner to claim fees generated from successful withdrawals.\"},\"decimals()\":{\"notice\":\"Required override of decimals() which is implemented by both ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\"},\"deposit(uint256)\":{\"notice\":\"Allows exchanging some underlying tokens for the same amount of L-Tokens.\"},\"depositFor(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.depositFor() that reverts. Use deposit() function instead.\"},\"feesRateUD7x3()\":{\"notice\":\"Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\"},\"frozenRequests(uint256)\":{\"notice\":\"Holds a list of all currently frozen withdrawal requests.\"},\"fund()\":{\"notice\":\"Holds address of fund wallet (managed by Ledgity financial team).\"},\"getAPR()\":{\"notice\":\"Retrieves the most recently set APR.\"},\"getExpectedRetained()\":{\"notice\":\"Computes the maximum amount of underlying tokens that should be retained by the contract (based on retention rate).\"},\"getWithdrawnAmountAndFees(address,uint256)\":{\"notice\":\"Computes fees and net withdrawn amount for a given account withdrawing a given amount.\"},\"globalBlacklist()\":{\"notice\":\"Retrieves the address of GlobalBlacklist contract.\"},\"globalOwner()\":{\"notice\":\"Retrieves the address of GlobalOwner contract.\"},\"globalPause()\":{\"notice\":\"Retrieves the address of GlobalPause contract.\"},\"initialize(address,address,address,address,address)\":{\"notice\":\"Initializer function of the contract. It replaces the constructor() function in the context of upgradeable contracts.\"},\"instantWithdrawal(uint256)\":{\"notice\":\"Allows instaneously exchanging a given amount of L-Tokens for the same amount of underlying tokens. It will fail if the contract currently doesn't hold enough underlying tokens to cover the withdrawal.\"},\"invested()\":{\"notice\":\"Retrieves the reference to the invested token contract.\"},\"ldyStaking()\":{\"notice\":\"Holds a reference to the LDYStaking contract.\"},\"listenToTransfers(address)\":{\"notice\":\"Adds a new contract to the L-Token transfers list.\"},\"owner()\":{\"notice\":\"Override of OwnableUpgradeable.owner() that retrieves the owner's address from the GlobalOwner contract instead.\"},\"paused()\":{\"notice\":\"Required override of paused() which is implemented by both GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\"},\"processBigQueuedRequest(uint256)\":{\"notice\":\"Processes a given queued big withdrawal request (one that exceeds half of the retention rate).\"},\"processQueuedRequests()\":{\"notice\":\"Processes queued withdrawal requests until there is else no more requests, else not enough underlying tokens to continue.\"},\"realBalanceOf(address)\":{\"notice\":\"Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet minted/distributed rewards.\"},\"realTotalSupply()\":{\"notice\":\"Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"recoverERC20(address,uint256)\":{\"notice\":\"Recovers a specified amount of a given token address.\"},\"recoverUnderlying()\":{\"notice\":\"Recovers underlying tokens accidentally sent to the contract.\"},\"renounceOwnership()\":{\"notice\":\"Override of OwnableUpgradeable.renounceOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"repatriate(uint256)\":{\"notice\":\"Used by the fund wallet to repatriate underlying tokens on the contract whenever those are required to fulfill some withdrawal requests.\"},\"requestWithdrawal(uint256)\":{\"notice\":\"Allows requesting the exchange of a given amount of L-Tokens for the same amount of underlying tokens. The request will be automatically processed later.\"},\"retentionRateUD7x3()\":{\"notice\":\"Holds the retention rate in UD7x3 format.\"},\"rewardsRedirectsFromTo(address)\":{\"notice\":\"Holds active rewards redirections in both from->to and to->from[] ways.\"},\"setAPR(uint16)\":{\"notice\":\"Updates the investment APR. Restricted to owner.\"},\"setFeesRate(uint32)\":{\"notice\":\"Updates the current withdrawal fee rate.\"},\"setFund(address)\":{\"notice\":\"Updates the address of the fund wallet.\"},\"setLDYStaking(address)\":{\"notice\":\"Updates the address of LDYStaking contract.\"},\"setRetentionRate(uint32)\":{\"notice\":\"Updates the current underlying token retention rate.\"},\"setWithdrawer(address)\":{\"notice\":\"Updates the address of the withdrawer wallet.\"},\"startRewardsRedirection(address,address)\":{\"notice\":\"Enables redirection of rewards from one account to another.\"},\"stopRewardsRedirection(address,address)\":{\"notice\":\"Disable an active rewards redirection.\"},\"totalQueued()\":{\"notice\":\"Holds the amount of L-Tokens currently in the withdrawal queue.\"},\"totalSupply()\":{\"notice\":\"Retrives the total supply of L-Tokens, including not yet minted withdrawal fees and L-Tokens currently in the withdrawal queue.\"},\"transferOwnership(address)\":{\"notice\":\"Override of OwnableUpgradeable.transferOwnership() that always reverts. Ownership is managed by the GlobalOwner contract and must be modified there.\"},\"transfersListeners(uint256)\":{\"notice\":\"Holds a list of contracts' references that are listening to L-Tokens transfers.\"},\"unclaimedFees()\":{\"notice\":\"Holds the amount of withdrawal fees not yet claimed by contract's owner.\"},\"unlistenToTransfers(address)\":{\"notice\":\"Removes a contract from the L-Token transfers list.\"},\"unmintedRewardsOf(address)\":{\"notice\":\"Retrieves the amount of given account's not yet minted rewards.\"},\"usableUnderlyings()\":{\"notice\":\"Holds the amount of underlying tokens considered as usable by the contract.\"},\"withdrawTo(address,uint256)\":{\"notice\":\"Override of ERC20WrapperUpgradeable.withdrawTo() that reverts. Use instantWithdrawal() or requestWithdrawal() functions instead.\"},\"withdrawalQueue(uint256)\":{\"notice\":\"Holds an ordered list of active withdrawal requests.\"},\"withdrawalQueueCursor()\":{\"notice\":\"Holds the index of the next withdrawal request to process in the queue.\"},\"withdrawer()\":{\"notice\":\"Holds address of withdrawer wallet (managed by withdrawal server).\"}},\"notice\":\"Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e., investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin. As soon as a wallet holds some L-Tokens, it starts receiving rewards in the form of additional L-Tokens, which are auto-compounded over time.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/LToken.sol\":\"LToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967Upgradeable {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/IERC1967Upgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x584ebdf9c1118a7c773f98788e3f3ede01982bdf8932aa06f5acc7d54876e161\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xb607cb94c27e89750f5ae2ccebcb94e654e926f6125f4fd4c6262c89875118ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\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\",\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\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 /**\\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[45] private __gap;\\n}\\n\",\"keccak256\":\"0xd14a627157b9a411d2410713e5dd3a377e9064bd5c194a90748bbf27ea625784\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\\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\",\"keccak256\":\"0x0e1f0f5f62f67a881cd1a9597acbc0a5e4071f3c2c10449a183b922ae7272e3f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../../../security/PausableUpgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev ERC20 token with pausable token transfers, minting and burning.\\n *\\n * Useful for scenarios such as preventing trades until the end of an evaluation\\n * period, or having an emergency switch for freezing all token transfers in the\\n * event of a large bug.\\n *\\n * IMPORTANT: This contract does not include public pause and unpause functions. In\\n * addition to inheriting this contract, you must define both functions, invoking the\\n * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate\\n * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will\\n * make the contract unpausable.\\n */\\nabstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {\\n function __ERC20Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __ERC20Pausable_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {ERC20-_beforeTokenTransfer}.\\n *\\n * Requirements:\\n *\\n * - the contract must not be paused.\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n super._beforeTokenTransfer(from, to, amount);\\n\\n require(!paused(), \\\"ERC20Pausable: token transfer while paused\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xf0bd7f71ffae5f0addd375e8511fbf2ad8ca0c9b2606c32d92bdda7d76a7a81c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Wrapper.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20Upgradeable.sol\\\";\\nimport \\\"../utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Extension of the ERC20 token contract to support token wrapping.\\n *\\n * Users can deposit and withdraw \\\"underlying tokens\\\" and receive a matching number of \\\"wrapped tokens\\\". This is useful\\n * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the\\n * wrapping of an existing \\\"basic\\\" ERC20 into a governance token.\\n *\\n * _Available since v4.2._\\n *\\n * @custom:storage-size 51\\n */\\nabstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {\\n IERC20Upgradeable private _underlying;\\n\\n function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n __ERC20Wrapper_init_unchained(underlyingToken);\\n }\\n\\n function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing {\\n require(underlyingToken != this, \\\"ERC20Wrapper: cannot self wrap\\\");\\n _underlying = underlyingToken;\\n }\\n\\n /**\\n * @dev See {ERC20-decimals}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n try IERC20MetadataUpgradeable(address(_underlying)).decimals() returns (uint8 value) {\\n return value;\\n } catch {\\n return super.decimals();\\n }\\n }\\n\\n /**\\n * @dev Returns the address of the underlying ERC-20 token that is being wrapped.\\n */\\n function underlying() public view returns (IERC20Upgradeable) {\\n return _underlying;\\n }\\n\\n /**\\n * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\\n */\\n function depositFor(address account, uint256 amount) public virtual returns (bool) {\\n address sender = _msgSender();\\n require(sender != address(this), \\\"ERC20Wrapper: wrapper can't deposit\\\");\\n SafeERC20Upgradeable.safeTransferFrom(_underlying, sender, address(this), amount);\\n _mint(account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\\n */\\n function withdrawTo(address account, uint256 amount) public virtual returns (bool) {\\n _burn(_msgSender(), amount);\\n SafeERC20Upgradeable.safeTransfer(_underlying, account, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal\\n * function that can be exposed with access control if desired.\\n */\\n function _recover(address account) internal virtual returns (uint256) {\\n uint256 value = _underlying.balanceOf(address(this)) - totalSupply();\\n _mint(account, value);\\n return value;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x14bb62a60fcbc911c33ac0e5456bf31ed50b502c30be46ee15bd3b698e91bd81\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.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 \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\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\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\\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\",\"keccak256\":\"0xd60f939a3ca0199014d079b4dd66aa757954334947d81eb5c1d35d7a83061ab3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../extensions/IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\\n * 0 before setting it to a non-zero value.\\n */\\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20PermitUpgradeable token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0x4dae161227d332808312ee2caf6384929321b83c16cc89b5642985fbec6b814c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n 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\",\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/DummyLDYStaking.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Ownable2Step} from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\n/**\\n * @title LDYStaking\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\\n * this one is deployed.\\n *\\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\\n * one the LToken contract relies on.\\n *\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LDYStaking is Ownable2Step {\\n /**\\n * @notice Holds a mapping of addresses that default to the highest staking tier.\\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\\n */\\n mapping(address => bool) public highTierAccounts;\\n\\n /**\\n * @notice Update high tier status of a given account.\\n * @param account The account to update the high tier status of.\\n */\\n function setHighTierAccount(address account, bool status) public onlyOwner {\\n highTierAccounts[account] = status;\\n }\\n\\n /**\\n * @dev Dummy tierOf() function that always return that the given account is not\\n * elligible to any LDY staking tier, except if the account is in the\\n * highTierAccounts mapping.\\n * @param account The account to check the tier of.\\n */\\n function tierOf(address account) public view returns (uint256 tier) {\\n if (highTierAccounts[account]) return 3;\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x7be21f1a748fedb7b8b873230e24be45922e8bc09e87147b980a0a596e7550db\",\"license\":\"MIT\"},\"contracts/src/GlobalBlacklist.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalBlacklist\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\\n * Ledgity Yield codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\\n * and getter functions to easily check against this global blacklist.\\n *\\n * @dev For further details, see \\\"GlobalBlacklist\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\\n /**\\n * @notice Mapping of accounts to their blacklist status.\\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\\n */\\n mapping(address => bool) private _list;\\n\\n /// @dev Emitted when `account` is blacklisted.\\n event Blacklisted(address account);\\n\\n /// @dev Emitted when `account` is unblacklisted.\\n event Unblacklisted(address account);\\n\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @notice Adds a given account to the blacklist.\\n * @param account The account's address to be blacklisted.\\n */\\n function blacklist(address account) external onlyOwner {\\n require(account != address(0), \\\"L20\\\");\\n _list[account] = true;\\n emit Blacklisted(account);\\n }\\n\\n /**\\n * @notice Removes a given account from the blacklist.\\n * @param account The account's address to be un-blacklisted.\\n */\\n function unBlacklist(address account) external onlyOwner {\\n _list[account] = false;\\n emit Unblacklisted(account);\\n }\\n\\n /**\\n * @notice Checks whether a given account is blacklisted.\\n * @param account Address of the account to check.\\n * @return 'true' if the account is blacklisted, 'false' otherwise\\n */\\n function isBlacklisted(address account) external view returns (bool) {\\n // Gas optimization: Avoid accessing storage if account is the zero address\\n // (e.g, during a mint or a burn of tokens)\\n if (account == address(0)) return false;\\n\\n // Else, return current account's blacklist status\\n return _list[account];\\n }\\n}\\n\",\"keccak256\":\"0x7e771076a06cfec935df22cf2d307df7e1f7df5b887976ec1dea30f8b68a878d\",\"license\":\"MIT\"},\"contracts/src/GlobalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {Ownable2StepUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalOwner\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds the address of a global owner account shared by all contracts of the\\n * Ledgity Yield's codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\\n * owner() function that retrieves the owner's address from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalOwner\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n */\\n function initialize() public initializer {\\n __Ownable2Step_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa3b880c4d82e796c162c99a398b569ce4a8e6d27232014b81a6a4503718f12dc\",\"license\":\"MIT\"},\"contracts/src/GlobalPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./abstracts/GlobalOwnableUpgradeable.sol\\\";\\n\\n/**\\n * @title GlobalPause\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\\n * codebase.\\n *\\n * @dev Specifically, some contracts within the codebase inherit from the\\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\\n * paused() function that retrieves the pause state from this contract instead.\\n *\\n * @dev For further details, see \\\"GlobalPause\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract GlobalPause is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n PausableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function initialize(address globalOwner_) public initializer {\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __UUPSUpgradeable_init();\\n }\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\\n * but restricted to contract's owner.\\n */\\n function pause() public onlyOwner {\\n _pause();\\n }\\n\\n function unpause() public onlyOwner {\\n _unpause();\\n }\\n}\\n\",\"keccak256\":\"0x9a0767e761dbd1d5800db03558c3903f229e6ef29f5fe5ff38f45fb4d7572e2e\",\"license\":\"MIT\"},\"contracts/src/LToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {ERC20WrapperUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\\\";\\nimport \\\"./abstracts/base/ERC20BaseUpgradeable.sol\\\";\\nimport {InvestUpgradeable} from \\\"./abstracts/InvestUpgradeable.sol\\\";\\nimport {LDYStaking} from \\\"./DummyLDYStaking.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {SUD} from \\\"./libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport {ITransfersListener} from \\\"./interfaces/ITransfersListener.sol\\\";\\n\\n/**\\n * @title LToken\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\\n * the form of additional L-Tokens, which are auto-compounded over time.\\n *\\n * @dev Definitions:\\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\\n * - Instant: Processed immediately.\\n * - Request: Queued for later processing.\\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\\n * - Request ID: The index of a withdrawal request in the queue array.\\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\\n * expected ways and are so considered safe to use by the contract.\\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\\n * processing.\\n *\\n * Note that words between parenthesis are sometimes omitted for brevity.\\n *\\n * @dev Deployment notice:\\n * This contract can safely receive funds immediately after initialization. (i.e., there\\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\\n * replace ASAP owner and fund wallets with multi-sig wallets.\\n *\\n * @dev For further details, see \\\"LToken\\\" section of whitepaper.\\n * @custom:oz-upgrades-unsafe-allow external-library-linking\\n * @custom:security-contact security@ledgity.com\\n */\\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /// @dev Represents type of actions triggering ActivityEvent events.\\n enum Action {\\n Deposit,\\n Withdraw\\n }\\n\\n /// @dev Represents different status of actions triggering ActivityEvent events.\\n enum Status {\\n Queued,\\n Cancelled,\\n Success,\\n Moved\\n }\\n\\n /**\\n * @notice Represents a withdrawal request in the queue.\\n * @dev A request fits in a single storage slot (32 bytes).\\n * @param account The account that initiated the request.\\n * @param amount The amount of underlying tokens requested.\\n */\\n struct WithdrawalRequest {\\n address account; // 20 bytes\\n uint96 amount; // 12 bytes\\n }\\n\\n /// @notice Upper limit of retention rate.\\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\\n\\n /// @notice Upper limit of fees rate.\\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\\n\\n /// @notice Used in activity events to represent the absence of request ID.\\n int256 private constant NO_ID = -1;\\n\\n /// @notice Holds a reference to the LDYStaking contract.\\n LDYStaking public ldyStaking;\\n\\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\\n address payable public withdrawer;\\n\\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\\n address public fund;\\n\\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\\n uint32 public feesRateUD7x3;\\n\\n /// @notice Holds the retention rate in UD7x3 format.\\n uint32 public retentionRateUD7x3;\\n\\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\\n uint256 public unclaimedFees;\\n\\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\\n uint256 public totalQueued;\\n\\n /**\\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\\n */\\n uint256 public usableUnderlyings;\\n\\n /// @notice Holds an ordered list of active withdrawal requests.\\n WithdrawalRequest[] public withdrawalQueue;\\n\\n /// @notice Holds the index of the next withdrawal request to process in the queue.\\n uint256 public withdrawalQueueCursor;\\n\\n /**\\n * @notice Holds a list of all currently frozen withdrawal requests.\\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\\n * it from blocking the queue.\\n */\\n WithdrawalRequest[] public frozenRequests;\\n\\n /**\\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\\n */\\n ITransfersListener[] public transfersListeners;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the contract's TVL.\\n * @dev TVL = realTotalSupply()\\n * @param newTVL The new TVL of the contract.\\n */\\n event TVLChangeEvent(uint256 newTVL);\\n\\n /**\\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\\n * @param account The account involved in the activity.\\n * @param action The type of activity.\\n * @param amount The amount of underlying tokens involved in the activity.\\n * @param newStatus The new status of the activity.\\n * @param newId The new ID of the request if it has been moved in the queue.\\n */\\n event ActivityEvent(\\n int256 indexed id,\\n address indexed account,\\n Action indexed action,\\n uint256 amount,\\n uint256 amountAfterFees,\\n Status newStatus,\\n int256 newId\\n );\\n\\n /**\\n * @notice Emitted to inform listeners that some rewards have been minted.\\n * @param account The account that received the rewards.\\n * @param balanceBefore The balance of the account before the minting.\\n * @param rewards The amount of minted rewards.\\n */\\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\\n\\n /// @notice Reverts if the function caller is not the withdrawer wallet.\\n modifier onlyWithdrawer() {\\n require(_msgSender() == withdrawer, \\\"L39\\\");\\n _;\\n }\\n\\n /// @notice Reverts if the function caller is not the fund wallet.\\n modifier onlyFund() {\\n require(_msgSender() == fund, \\\"L40\\\");\\n _;\\n }\\n\\n /**\\n * @notice Initializer function of the contract. It replaces the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\\n */\\n function initialize(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address ldyStaking_,\\n address underlyingToken\\n ) public initializer {\\n // Initialize ERC20 base.\\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\\n __ERC20Base_init(\\n globalOwner_,\\n globalPause_,\\n globalBlacklist_,\\n string(abi.encodePacked(\\\"Ledgity \\\", underlyingSymbol)),\\n string(abi.encodePacked(\\\"L\\\", underlyingSymbol))\\n );\\n\\n // IMPORTANT: Below calls must not be restricted to owner at any point.\\n // This is because the GlobalOwner contract may not be a fresh one, and so\\n // the contract deployer may not be the owner anymore after ERC20Base init.\\n\\n // Initialize other parents contracts.\\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\\n __Invest_init_unchained(address(this));\\n\\n // Set LDYStaking contract\\n ldyStaking = LDYStaking(ldyStaking_);\\n\\n // Set initial withdrawal fees rate to 0.3%\\n feesRateUD7x3 = 300;\\n\\n // Set initial retention rate to 10%\\n retentionRateUD7x3 = 10_000;\\n\\n // Default withdrawer and fund wallet to contract owner address. This prevents\\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\\n withdrawer = payable(owner());\\n fund = payable(owner());\\n }\\n\\n /**\\n * @notice Required override of decimals() which is implemented by both\\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\\n * decimals amount of the underlying stablecoin token.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function decimals()\\n public\\n view\\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\\n returns (uint8)\\n {\\n return ERC20WrapperUpgradeable.decimals();\\n }\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @notice Updates the current withdrawal fee rate.\\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\\n */\\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \\\"L88\\\");\\n feesRateUD7x3 = feesRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the current underlying token retention rate.\\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\\n * deposited assets will ever be exposed in this contract (reduces attack surface).\\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\\n */\\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \\\"L41\\\");\\n retentionRateUD7x3 = retentionRateUD7x3_;\\n }\\n\\n /**\\n * @notice Updates the address of LDYStaking contract.\\n * @param ldyStakingAddress The address of the new LDYStaking contract.\\n */\\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\\n ldyStaking = LDYStaking(ldyStakingAddress);\\n }\\n\\n /**\\n * @notice Updates the address of the withdrawer wallet.\\n * @param withdrawer_ The address of the new withdrawer wallet.\\n */\\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\\n // Ensure address is not the zero address (pre-processing fees would be lost else)\\n require(withdrawer_ != address(0), \\\"L63\\\");\\n\\n // Set new withdrawer wallet's address\\n withdrawer = withdrawer_;\\n }\\n\\n /**\\n * @notice Updates the address of the fund wallet.\\n * @param fund_ The address of the new fund wallet.\\n */\\n function setFund(address payable fund_) public onlyOwner {\\n // Ensure address is not the zero address (deposited tokens would be lost else)\\n require(fund_ != address(0), \\\"L64\\\");\\n\\n // Set new fund wallet's address\\n fund = fund_;\\n }\\n\\n /**\\n * @notice Adds a new contract to the L-Token transfers list.\\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\\n * specified contract will be called.\\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\\n * contracts that are not owned by the Ledgity team.\\n * @param listenerContract The address of the new transfers listener contract.\\n */\\n function listenToTransfers(address listenerContract) public onlyOwner {\\n transfersListeners.push(ITransfersListener(listenerContract));\\n }\\n\\n /**\\n * @notice Removes a contract from the L-Token transfers list.\\n * @dev The onLTokenTransfer() function of the specified contract will not be called\\n * anymore each time a L-Token transfer occurs.\\n * @param listenerContract The address of the listener contract.\\n */\\n function unlistenToTransfers(address listenerContract) public onlyOwner {\\n // Find index of listener contract in transferListeners array\\n int256 index = -1;\\n uint256 transfersListenersLength = transfersListeners.length;\\n for (uint256 i = 0; i < transfersListenersLength; i++) {\\n if (address(transfersListeners[i]) == listenerContract) {\\n index = int256(i);\\n break;\\n }\\n }\\n\\n // Revert if given contract wasn't listening to transfers\\n require(index > -1, \\\"L42\\\");\\n\\n // Else, remove transfers listener contract from listeners array\\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\\n transfersListeners.pop();\\n }\\n\\n /**\\n * @notice Retrieves the amount of given account's not yet minted rewards.\\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\\n * context of LToken, this function returns the amount of rewards that have not been\\n * distributed/minted yet to the specified account.\\n * @dev This is particularly useful for off-chain services to display charts and\\n * statistics, as seen in the Ledgity Yield's frontend.\\n * @param account The account to check the unminted rewards of.\\n * @return The amount of account's unminted rewards.\\n */\\n function unmintedRewardsOf(address account) public view returns (uint256) {\\n return _rewardsOf(account, true);\\n }\\n\\n /**\\n * @notice Retrieves the \\\"real\\\" balance of an account, i.e., excluding its not yet\\n * minted/distributed rewards.\\n * @param account The account to check the real balance of.\\n * @return The real balance of the account.\\n */\\n function realBalanceOf(address account) public view returns (uint256) {\\n return super.balanceOf(account);\\n }\\n\\n /**\\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\\n * not been yet minted to the specified account.\\n * @param account The account to check the total balance of.\\n * @return The total balance of the account.\\n */\\n function balanceOf(address account) public view override returns (uint256) {\\n return realBalanceOf(account) + unmintedRewardsOf(account);\\n }\\n\\n /**\\n * @notice Returns the \\\"real\\\" amount of existing L-Tokens, i.e., excluding not yet\\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\\n * @return The real total supply of L-Tokens.\\n */\\n function realTotalSupply() public view returns (uint256) {\\n return super.totalSupply();\\n }\\n\\n /**\\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\\n * fees and L-Tokens currently in the withdrawal queue.\\n * @return The total supply of L-Tokens.\\n */\\n function totalSupply() public view override returns (uint256) {\\n return realTotalSupply() + totalQueued + unclaimedFees;\\n }\\n\\n /**\\n * @notice Recovers a specified amount of a given token address.\\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\\n * token from being the underlying token.\\n * @inheritdoc RecoverableUpgradeable\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\\n // Ensure the token is not the underlying token\\n require(tokenAddress != address(underlying()), \\\"L43\\\");\\n\\n // Proceed to recovery\\n super.recoverERC20(tokenAddress, amount);\\n }\\n\\n /**\\n * @notice Recovers underlying tokens accidentally sent to the contract.\\n * @dev To prevent owner from being able to drain the contract, this function only\\n * allows recovering \\\"unusable\\\" underlying tokens, i.e., tokens that have not been\\n * sent through fund() or deposit() functions.\\n */\\n function recoverUnderlying() external onlyOwner {\\n // Compute the recoverable amount by taking the difference between the contract's\\n // balance and the amount of usable underlying tokens\\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\\n\\n // Revert if there is nothing to recover\\n require(recoverableAmount > 0, \\\"L44\\\");\\n\\n // Else, proceed to underlying tokens recovery\\n super.recoverERC20(address(underlying()), recoverableAmount);\\n }\\n\\n /**\\n * @notice Retrieves the amount of underlying tokens invested by the given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\\n * LToken contract, the investment of an account is equal to its real balance.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _investmentOf(address account) internal view override returns (uint256) {\\n return realBalanceOf(account);\\n }\\n\\n /**\\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\\n * @dev Implementing this function is required by the InvestUpgradeable contract so\\n * it can distribute rewards to accounts before each period reset.\\n * @dev InvestUpgradeable contract already ensure that amount > 0.\\n * @inheritdoc InvestUpgradeable\\n */\\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\\n // Inform listeners of the rewards minting\\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\\n\\n // Mint L-Tokens rewards to account\\n _mint(account, amount);\\n\\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\\n return true;\\n }\\n\\n /**\\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\\n * called each time an account's balance is going to change.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\\n * @inheritdoc ERC20BaseUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\\n\\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\\n if (from != address(0)) _beforeInvestmentChange(from, true);\\n if (to != address(0)) _beforeInvestmentChange(to, true);\\n }\\n\\n /**\\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\\n * transfers listeners.\\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\\n * already checked in _beforeTokenTransfer().\\n * @inheritdoc ERC20Upgradeable\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n // If some L-Token have been burned/minted, inform listeners of a TVL change\\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\\n\\n // Trigger onLTokenTransfer() functions of all the transfers listeners\\n for (uint256 i = 0; i < transfersListeners.length; i++) {\\n transfersListeners[i].onLTokenTransfer(from, to, amount);\\n }\\n }\\n\\n /**\\n * @notice Computes the maximum amount of underlying tokens that should be retained\\n * by the contract (based on retention rate).\\n * @return amount The expected amount of retained underlying tokens.\\n */\\n function getExpectedRetained() public view returns (uint256 amount) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert totalSupply and retentionRate to SUD\\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\\n\\n // Compute and return expected retained amount\\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(expectedRetainedSUD, d);\\n }\\n\\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\\n function _transferExceedingToFund() internal {\\n // Retrieve the expected amount retained\\n uint256 expectedRetained = getExpectedRetained();\\n\\n // If usable underlyings are less than or equal to expected retained, return\\n if (usableUnderlyings <= expectedRetained) return;\\n\\n // Else, exceeding amount is equal to difference between those values\\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= exceedingAmount;\\n\\n // Transfer the exceeding amount to the fund wallet\\n underlying().safeTransfer(fund, exceedingAmount);\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L45\\\");\\n }\\n\\n /**\\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\\n * Use deposit() function instead.\\n * @inheritdoc ERC20WrapperUpgradeable\\n */\\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\\n account; // Silence unused variable compiler warning\\n amount;\\n revert(\\\"L46\\\");\\n }\\n\\n /**\\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\\n * @param amount The amount of underlying tokens to deposit.\\n */\\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough underlying tokens to deposit\\n require(underlying().balanceOf(_msgSender()) >= amount, \\\"L47\\\");\\n\\n // Update usable underlyings balance accordingly\\n usableUnderlyings += amount;\\n\\n // Inform listeners of the deposit activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Deposit,\\n amount,\\n amount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\\n super.depositFor(_msgSender(), amount);\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\\n * given amount.\\n * @param account The account initiating the withdrawal.\\n * @param amount The amount of the withdrawal.\\n */\\n function getWithdrawnAmountAndFees(\\n address account,\\n uint256 amount\\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\\n // If the account is eligible to staking tier 2, no fees are applied\\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\\n\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Convert amount and fees rate to SUD\\n uint256 amountSUD = SUD.fromAmount(amount, d);\\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\\n\\n // Compute fees and withdrawn amount (initial amount minus fees)\\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\\n fees = SUD.toAmount(feesSUD, d);\\n withdrawnAmount = amount - fees;\\n }\\n\\n /**\\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\\n * enough underlying tokens to cover the withdrawal.\\n * @dev In order to save some gas and time to users, frontends should propose this\\n * function to users only when it has been verified that it will not revert. They\\n * should propose the requestWithdrawal() function otherwise.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L48\\\");\\n\\n // Can the contract cover this withdrawal plus all already queued requests?\\n bool cond1 = totalQueued + amount <= usableUnderlyings;\\n\\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\\n\\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\\n if (!(cond1 || cond2)) revert(\\\"L49\\\");\\n\\n // Else, retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\\n\\n // Increase unclaimed fees amount accordingly\\n unclaimedFees += fees;\\n\\n // Decrease usable underlyings balance accordingly\\n usableUnderlyings -= withdrawnAmount;\\n\\n // Inform listeners of this instant withdrawal activity event\\n emit ActivityEvent(\\n NO_ID,\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Burn withdrawal fees from the account\\n _burn(_msgSender(), fees);\\n\\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\\n super.withdrawTo(_msgSender(), withdrawnAmount);\\n }\\n\\n /**\\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\\n * amount of underlying tokens. The request will be automatically processed later.\\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\\n * paid by the withdrawer wallet.\\n * @param amount The amount L-Tokens to withdraw.\\n */\\n function requestWithdrawal(\\n uint256 amount\\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\\n // Ensure the account has enough L-Tokens to withdraw\\n require(amount <= balanceOf(_msgSender()), \\\"L53\\\");\\n\\n // Ensure the requested amount doesn't overflow uint96\\n require(amount <= type(uint96).max, \\\"L54\\\");\\n\\n // Ensure the sender attached the pre-paid processing gas fees\\n require(msg.value == 0.003 * 10 ** 18, \\\"L55\\\");\\n\\n // Create withdrawal request data\\n WithdrawalRequest memory request = WithdrawalRequest({\\n account: _msgSender(),\\n amount: uint96(amount)\\n });\\n\\n // Will hold the request ID\\n uint256 requestId;\\n\\n // Append request to the withdrawal queue:\\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\\n withdrawalQueueCursor--;\\n requestId = withdrawalQueueCursor;\\n withdrawalQueue[requestId] = request;\\n }\\n // - At the end else\\n else {\\n withdrawalQueue.push(request);\\n requestId = withdrawalQueue.length - 1;\\n }\\n\\n // Increase total amount queued accordingly\\n totalQueued += amount;\\n\\n // Inform listeners of this new queued withdrawal activity event\\n emit ActivityEvent(\\n int256(requestId),\\n _msgSender(),\\n Action.Withdraw,\\n amount,\\n amount,\\n Status.Queued,\\n NO_ID\\n );\\n\\n // Burn withdrawal L-Tokens amount from account's balance\\n _burn(_msgSender(), amount);\\n\\n // Forward pre-paid processing gas fees to the withdrawer wallet\\n (bool sent, ) = withdrawer.call{value: msg.value}(\\\"\\\");\\n require(sent, \\\"L56\\\");\\n }\\n\\n /**\\n * @notice Processes queued withdrawal requests until there is else no more requests,\\n * else not enough underlying tokens to continue.\\n * @dev For further details, see \\\"LToken > Withdrawals\\\" section of whitepaper.\\n */\\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\\n // Accumulators variables, will be written on-chain after the loop\\n uint256 cumulatedFees = 0;\\n uint256 cumulatedWithdrawnAmount = 0;\\n uint256 nextRequestId = withdrawalQueueCursor;\\n\\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\\n // requests are increasing the queue length when moved at the end of the queue.\\n uint256 queueLength = withdrawalQueue.length;\\n\\n // Iterate over requests to be processed\\n while (nextRequestId < queueLength) {\\n // Stop processing requests if there is not enough gas left to continue the\\n // loop and properly end the function call. This prevents an attacker from\\n // blocking the withdrawal processing by creating a ton of tiny requests so\\n // this function call cannot fit anymore in block gas limit.\\n if (gasleft() < 45000) break;\\n\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\\n\\n // Skip empty request (processed big requests or cancelled requests)\\n if (request.account == address(0)) {}\\n //\\n // If account has been blacklisted since request emission\\n else if (isBlacklisted(request.account)) {\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request in the frozen requests list\\n frozenRequests.push(request);\\n }\\n //\\n // Or if request is a big request, move it at the end of the queue for now.\\n // This request will be processed manually later using processBigQueuedRequest()\\n else if (request.amount > getExpectedRetained() / 2) {\\n // Inform listeners of this queued request being moved at the end of the queue\\n emit ActivityEvent(\\n int256(nextRequestId),\\n _msgSender(),\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Moved,\\n int256(withdrawalQueue.length)\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Append request at the end of the queue\\n withdrawalQueue.push(request);\\n }\\n //\\n // Else, continue request processing\\n else {\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Break if the contract doesn't hold enough funds to cover the request\\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\\n\\n // Accumulate fees and withdrawn amount\\n cumulatedFees += fees;\\n cumulatedWithdrawnAmount += withdrawnAmount;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(nextRequestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[nextRequestId];\\n\\n // Transfer underlying tokens to account. Burning L-Tokens is not required\\n // as equestWithdrawal() already did it.\\n // Security note: Re-entrancy warning are disabled as the request has\\n // just been deleted from the queue, it will so be skipped if trying to\\n // process it again.\\n // slither-disable-next-line reentrancy-no-eth\\n underlying().safeTransfer(request.account, withdrawnAmount);\\n }\\n\\n // Increment next request ID\\n nextRequestId++;\\n }\\n\\n // Increase unclaimed fees by the amount of cumulated fees\\n unclaimedFees += cumulatedFees;\\n\\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\\n usableUnderlyings -= cumulatedWithdrawnAmount;\\n\\n // Decrease total amount queued by the cumulated amount requested\\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\\n\\n // Update new queue cursor\\n withdrawalQueueCursor = nextRequestId;\\n\\n // Retention rate cannot exceeds as the withdrawal decreases both usable\\n // underlyings and expected retained amounts by the same number and as the\\n // expected retained amount is a subset of usable underlyings amount.\\n }\\n\\n /**\\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\\n * the retention rate).\\n * @dev In contrast to non-big requests processing, this function will uses to fund\\n * wallet's balance to fill the request. This allows processing requests that are\\n * greater than retention rate without having to exceed this rate on the contract.\\n * @param requestId The ID of the big request to process.\\n */\\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure the request is active\\n require(request.account != address(0), \\\"L66\\\");\\n\\n // Ensure the request emitter has not been blacklisted since request emission\\n require(!isBlacklisted(request.account), \\\"L50\\\");\\n\\n // Ensure this is indeed a big request\\n require(request.amount > getExpectedRetained() / 2, \\\"L51\\\");\\n\\n // Retrieve withdrawal fees and net withdrawn amount\\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\\n request.account,\\n request.amount\\n );\\n\\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\\n uint256 fundBalance = underlying().balanceOf(fund);\\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \\\"L52\\\");\\n\\n // Increase amount of unclaimed fees accordingly\\n unclaimedFees += fees;\\n\\n // Decrease total queued amount by request amount\\n totalQueued -= request.amount;\\n\\n // Increment queue cursor if request was the next request to be processed\\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\\n\\n // Inform listeners of this queued withdrawal processing activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n withdrawnAmount,\\n Status.Success,\\n NO_ID\\n );\\n\\n // Remove request from queue\\n delete withdrawalQueue[requestId];\\n\\n // If fund wallet's balance can cover request, rely on it only\\n if (withdrawnAmount <= fundBalance) {\\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\\n }\\n // Else, cover request from both fund wallet and contract balances\\n else {\\n // Compute amount missing from fund wallet to cover request\\n uint256 missingAmount = withdrawnAmount - fundBalance;\\n\\n // Decrease usable amount of underlying tokens accordingly\\n usableUnderlyings -= missingAmount;\\n\\n // Transfer entire fund balance to request's emitter\\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\\n\\n // Transfer missing amount from contract balance to request emitter\\n underlying().safeTransfer(request.account, missingAmount);\\n }\\n\\n // Transfer exceeding underlying tokens to the fund wallet\\n _transferExceedingToFund();\\n }\\n\\n /**\\n * @notice Cancels a given withdrawal request. The request emitter receive back its\\n * L-Tokens and no fees will be charged.\\n * @param requestId The ID of the withdrawal request to cancel.\\n */\\n function cancelWithdrawalRequest(\\n uint256 requestId\\n ) public whenNotPaused notBlacklisted(_msgSender()) {\\n // Retrieve request data\\n WithdrawalRequest memory request = withdrawalQueue[requestId];\\n\\n // Ensure request belongs to caller\\n require(_msgSender() == request.account, \\\"L57\\\");\\n\\n // Decrease total amount queued accordingly\\n totalQueued -= request.amount;\\n\\n // Delete the withdrawal request from queue\\n delete withdrawalQueue[requestId];\\n\\n // Inform listeners of this cancelled withdrawal request activity event\\n emit ActivityEvent(\\n int256(requestId),\\n request.account,\\n Action.Withdraw,\\n request.amount,\\n request.amount,\\n Status.Cancelled,\\n NO_ID\\n );\\n\\n // Mint back L-Tokens to account\\n _mint(request.account, uint256(request.amount));\\n }\\n\\n /**\\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\\n * whenever those are required to fulfill some withdrawal requests.\\n * @dev The function will revert if repatriated amount makes the contract exceeding\\n * the retention rate.\\n * @param amount The amount of underlying tokens to repatriate.\\n */\\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\\n // Ensure the fund wallet has enough funds to repatriate\\n require(amount <= underlying().balanceOf(fund), \\\"L58\\\");\\n\\n // Calculate new contract usable balance\\n uint256 newBalance = usableUnderlyings + amount;\\n\\n // Ensure the new balance doesn't exceed the retention rate\\n require(newBalance <= getExpectedRetained(), \\\"L59\\\");\\n\\n // Increase usable underlyings amount by repatriated amount\\n usableUnderlyings += amount;\\n\\n // Transfer amount from fund wallet to contract\\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\\n }\\n\\n /// @notice Used by owner to claim fees generated from successful withdrawals.\\n function claimFees() external onlyOwner {\\n // Ensure there are some fees to claim\\n require(unclaimedFees > 0, \\\"L60\\\");\\n\\n // Ensure the contract holds enough underlying tokens to cover fees\\n require(usableUnderlyings >= unclaimedFees, \\\"L61\\\");\\n\\n // Decrease usable underlyings amount accordingly\\n usableUnderlyings -= unclaimedFees;\\n\\n // Store fees amount in memory and reset unclaimed fees amount\\n uint256 fees = unclaimedFees;\\n unclaimedFees = 0;\\n\\n // Transfer unclaimed fees to owner\\n underlying().safeTransfer(owner(), fees);\\n }\\n}\\n\",\"keccak256\":\"0x60644fd9d32b09ccadb2a138a53cbbca7aa12b312a3b5bcaec8579a1a5a49972\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalOwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {GlobalOwner} from \\\"../GlobalOwner.sol\\\";\\n\\n/**\\n * @title GlobalOwnableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\\n * contract (see GlobalOwner.sol). This design facilitates centralized management\\n * of ownership for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalOwner state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalOwnableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\\n /**\\n * @notice The GlobalOwner contract the ownership will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalOwner private _globalOwner;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init_unchained(globalOwner_);\\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\\n // the initial _owner value, calling it would have no effect.\\n }\\n\\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\\n _globalOwner = GlobalOwner(globalOwner_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalOwner contract.\\n * @return The address of the GlobalOwner contract.\\n */\\n function globalOwner() public view returns (address) {\\n return address(_globalOwner);\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\\n * from the GlobalOwner contract instead.\\n * @return The address of the owner\\n */\\n function owner() public view override returns (address) {\\n return _globalOwner.owner();\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function transferOwnership(address newOwner) public view override onlyOwner {\\n newOwner; // Silence unused variable compiler warning\\n revert(\\\"L8\\\");\\n }\\n\\n /**\\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\\n * Ownership is managed by the GlobalOwner contract and must be modified there.\\n */\\n function renounceOwnership() public view override onlyOwner {\\n revert(\\\"L65\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9203f7a2a19def126d8ff0fde8357053ffcf1100d65ec8faec8299b6ed2c0c5a\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalPausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport {GlobalPause} from \\\"../GlobalPause.sol\\\";\\n\\n/**\\n * @title GlobalPausableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\\n * contract (see GlobalPause.sol). This design facilitates centralized management of\\n * pause state for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure\\n * The _globalPause state must be set at initialization time and, for evident security\\n * reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalPausableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\\n /**\\n * @notice The GlobalPause contract the pause state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalPause private _globalPause;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalPause_ The address of the GlobalPause contract.\\n */\\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n }\\n\\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\\n _globalPause = GlobalPause(globalPause_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalPause contract.\\n * @return The address of the GlobalPause contract.\\n */\\n function globalPause() public view returns (address) {\\n return address(_globalPause);\\n }\\n\\n /**\\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\\n * from the GlobalPause contract instead.\\n * @return Whether the contract is paused or not.\\n */\\n function paused() public view virtual override returns (bool) {\\n return _globalPause.paused();\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xff508c0b8c48916885453b4894d0401e94580fb24fb6af1885a3e160864cde94\",\"license\":\"MIT\"},\"contracts/src/abstracts/GlobalRestrictableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalBlacklist} from \\\"../GlobalBlacklist.sol\\\";\\n\\n/**\\n * @title GlobalRestrictableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts will inherit a blacklist state from the specified\\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\\n * centralized management of a blacklist for all the Ledgity Yield contracts.\\n *\\n * @dev Security measure:\\n * The _globalBlacklist state must be set at initialization time and, for evident\\n * security reasons, cannot be changed afterward.\\n *\\n * @dev For further details, see \\\"GlobalRestrictableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract GlobalRestrictableUpgradeable is Initializable {\\n /**\\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\\n * @dev This state is private so derived contracts cannot change its value.\\n */\\n GlobalBlacklist private _globalBlacklist;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n }\\n\\n function __GlobalRestrictable_init_unchained(\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\\n }\\n\\n /**\\n * @notice Retrieves the address of GlobalBlacklist contract.\\n * @return The address of the GlobalBlacklist contract.\\n */\\n function globalBlacklist() public view returns (address) {\\n return address(_globalBlacklist);\\n }\\n\\n /**\\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n */\\n modifier notBlacklisted(address account) {\\n require(isBlacklisted(account) == false, \\\"L9\\\");\\n _;\\n }\\n\\n /**\\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\\n * @param account Address to verify.\\n * @return Whether the account is blacklisted.\\n */\\n function isBlacklisted(address account) internal view returns (bool) {\\n return _globalBlacklist.isBlacklisted(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x0032fde90d9cf23e70dd4b604ae0d1ed3283f117bc24f68d32f8933e1bd372bc\",\"license\":\"MIT\"},\"contracts/src/abstracts/InvestUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"./GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"./GlobalRestrictableUpgradeable.sol\\\";\\nimport \\\"./base/BaseUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../abstracts/RecoverableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport {APRHistory as APRH} from \\\"../libs/APRHistory.sol\\\";\\nimport {SUD} from \\\"../libs/SUD.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title InvestUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with utilities to manage an invested token,\\n * users' investment periods, rewards calculations, virtual balances, and auto-compounding.\\n *\\n * @dev Intuition:\\n * This contract primarily exists for code splitting and reusability. It unburdens the\\n * LToken contract code, making it easier to understand and maintain.\\n *\\n * This contract is generic because it may be used in the LDYStaking contract in the future.\\n *\\n * @dev Definitions:\\n * - Investment: The act of depositing or investing tokens into the contract.\\n * - Investment period: Time between the last invested amount change and the present.\\n * - Virtual balance: Temporary storage for account rewards, used when those can't be\\n * distributed between investment periods.\\n * - Rewards redirection: Mechanism allowing an account to redirect its rewards to another.\\n *\\n * @dev Derived contract must:\\n * - Set invested token during initialization\\n * - Implement _investmentOf() function\\n * - (optionally) Implement _distributeRewards() function\\n *\\n * @dev For further details, see \\\"InvestmentUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract InvestUpgradeable is BaseUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n using APRH for APRH.Pack[];\\n\\n /**\\n * @notice Represents an account's investment period.\\n * @param timestamp The timestamp of the most recent rewards distribution.\\n * @param ref The reference of the last APR checkpoint at that timestamp.\\n */\\n struct InvestmentPeriod {\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n APRH.Reference ref;\\n }\\n\\n /**\\n * @notice Represents the investment details of an account.\\n * @param period The current investment period of the account.\\n * @param virtualBalance May hold a part of account rewards until they are claimed.\\n */\\n struct AccountDetails {\\n InvestmentPeriod period;\\n uint256 virtualBalance;\\n }\\n\\n /// @notice Holds a reference to the invested token's contract.\\n IERC20Upgradeable private _invested;\\n\\n /// @notice Holds investment details of each account.\\n mapping(address => AccountDetails) internal accountsDetails;\\n\\n /// @notice Holds an history of the APR value over time (see APRHistory.sol).\\n APRH.Pack[] private _aprHistory;\\n\\n /// @notice Holds active rewards redirections in both from->to and to->from[] ways.\\n mapping(address => address) public rewardsRedirectsFromTo;\\n mapping(address => address[]) public rewardsRedirectsToFrom;\\n\\n /// @notice Is used to prevent infinite loop in _beforeInvestmentChange().\\n bool private _isClaiming;\\n\\n /**\\n * @notice Emitted to inform listeners about a change in the APR's value.\\n * @param newAPRUD7x3 The new APR in UD7x3 format.\\n */\\n event APRChangeEvent(uint16 newAPRUD7x3);\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param invested_ The address of the invested token contract.\\n */\\n function __Invest_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n address invested_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __Invest_init_unchained(invested_);\\n }\\n\\n function __Invest_init_unchained(address invested_) internal onlyInitializing {\\n // Set invested token\\n _invested = IERC20Upgradeable(invested_);\\n\\n // Define initial APR to 0%. This would prevent getAPR() from reverting because\\n // of an empty APR history\\n _aprHistory.setAPR(0);\\n }\\n\\n /**\\n * @notice Retrieves the reference to the invested token contract.\\n * @return The reference to the invested token contract.\\n */\\n function invested() public view returns (IERC20Upgradeable) {\\n return _invested;\\n }\\n\\n /**\\n * @notice Updates the investment APR. Restricted to owner.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(uint16 aprUD7x3) public onlyOwner {\\n _aprHistory.setAPR(aprUD7x3);\\n emit APRChangeEvent(aprUD7x3);\\n }\\n\\n /**\\n * @notice Retrieves the most recently set APR.\\n * @return The current APR in UD7x3 format.\\n */\\n function getAPR() public view returns (uint16) {\\n return _aprHistory.getAPR();\\n }\\n\\n /**\\n * @notice Enables redirection of rewards from one account to another.\\n * @param from The address of the account to redirect rewards from.\\n * @param to The address of the account to redirect rewards to.\\n */\\n function startRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure the address is not already redirecting rewards\\n require(rewardsRedirectsFromTo[from] == address(0), \\\"L62\\\");\\n\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L12\\\");\\n require(to != address(0), \\\"L13\\\");\\n\\n // Ensure 'from' and 'to' addresses are distinct\\n require(from != to, \\\"L14\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L15\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Activate rewards redirection\\n rewardsRedirectsFromTo[from] = to;\\n rewardsRedirectsToFrom[to].push(from);\\n }\\n\\n /**\\n * @notice Disable an active rewards redirection.\\n * @param from The address of the account to stop redirecting rewards from.\\n * @param to The address of the account to stop redirecting rewards to.\\n */\\n function stopRewardsRedirection(\\n address from,\\n address to\\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\\n // Ensure neither 'from' nor 'to' are the zero address\\n require(from != address(0), \\\"L16\\\");\\n require(to != address(0), \\\"L17\\\");\\n\\n // Ensure function caller is either the owner or the 'from' address\\n require(_msgSender() == owner() || _msgSender() == from, \\\"L18\\\");\\n\\n // Ensure a rewards redirection was active\\n require(rewardsRedirectsFromTo[from] == to, \\\"L19\\\");\\n\\n // Distribute current rewards and reset investment periods of both accounts\\n _beforeInvestmentChange(from, true);\\n _beforeInvestmentChange(to, true);\\n\\n // Retrieve 'from' index in the redirection array of 'to'\\n int256 fromIndex = -1;\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[to].length; i++) {\\n if (rewardsRedirectsToFrom[to][i] == from) {\\n fromIndex = int256(i);\\n break;\\n }\\n }\\n\\n // fromIndex should never be -1 at this point\\n assert(fromIndex >= 0);\\n\\n // Deactivate rewards redirection\\n rewardsRedirectsFromTo[from] = address(0);\\n rewardsRedirectsToFrom[to][uint256(fromIndex)] = rewardsRedirectsToFrom[to][\\n rewardsRedirectsToFrom[to].length - 1\\n ];\\n rewardsRedirectsToFrom[to].pop();\\n }\\n\\n /**\\n * @notice Retrieves the total amount of tokens invested by the given account.\\n * @dev Derived contracts must implement this function.\\n * @param account The account to get the investment of.\\n * @return The total amount of tokens invested by the given account.\\n */\\n function _investmentOf(address account) internal view virtual returns (uint256);\\n\\n /**\\n * @notice Distributes a specified amount of rewards to a given account.\\n * @dev Derived contracts may optionally implement this function.\\n * @dev Implementations must return true to indicate a successful distribution, and\\n * false otherwise. If it returns false, the rewards will be added to the account's\\n * virtual balance, in order to be claimed later.\\n * @param account The account to claim the rewards of.\\n * @param amount The amount of rewards to claim.\\n * @return Whether the rewards distribution was successfull.\\n */\\n function _distributeRewards(address account, uint256 amount) internal virtual returns (bool) {\\n account; // Silence unused variables warning\\n amount;\\n return false;\\n }\\n\\n /**\\n * @notice Computes the rewards accrued over a specified period of time, based on a\\n * given APR and amount of invested tokens.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param beginTimestamp The moment the period commenced.\\n * @param endTimestamp The moment the period concluded.\\n * @param aprUD7x3 The APR during this period, in UD7x3 format.\\n * @param investedAmount The amount of tokens deposited/invested during the period.\\n * @return The amount of rewards generated during the period.\\n */\\n function _calculatePeriodRewards(\\n uint40 beginTimestamp,\\n uint40 endTimestamp,\\n uint16 aprUD7x3,\\n uint256 investedAmount\\n ) internal view returns (uint256) {\\n // Cache invested token's decimals number\\n uint256 d = SUD.decimalsOf(address(invested()));\\n\\n // Compute the number of elapsed years\\n uint256 elapsedTimeSUD = SUD.fromInt(endTimestamp - beginTimestamp, d);\\n uint256 elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1, d)) / SUD.fromInt(365 days, d);\\n\\n // Compute the growth in invested amount (thanks to rewards)\\n uint256 aprSUD = SUD.fromRate(aprUD7x3, d);\\n uint256 growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1, d);\\n\\n // Compute and return the rewards\\n uint256 investedAmountSUD = SUD.fromAmount(investedAmount, d);\\n uint256 rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100, d);\\n return SUD.toAmount(rewardsSUD, d);\\n }\\n\\n /**\\n * @notice Computes the sum of given account's invested amount, plus invested amount\\n * of all accounts that recursively redirect rewards to this account.\\n * @param account The account to calculate the deep investment of.\\n * @return deepInvestedAmount The deep invested amount.\\n */\\n function _deepInvestmentOf(address account) internal view returns (uint256 deepInvestedAmount) {\\n // Consider account's direct investment\\n deepInvestedAmount += _investmentOf(account);\\n\\n // But also the deep investments of all accounts redirecting rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n deepInvestedAmount += _deepInvestmentOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Computes the amount of unclaimed/undistributed rewards of a given account.\\n * @dev For further details, see \\\"InvestUpgradeable > Rewards calculation\\\" section of\\n * the whitepaper.\\n * @param account The account to calculate the unclaimed rewards of.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n * @return rewards The amount of unclaimed/undistributed rewards of the given account.\\n */\\n function _rewardsOf(\\n address account,\\n bool autocompound\\n ) internal view returns (uint256 rewards) {\\n // Retrieve account's investment details\\n AccountDetails memory details = accountsDetails[account];\\n\\n // Retrieve account's deep invested amount\\n uint256 investedAmount = _deepInvestmentOf(account);\\n\\n // Return 0 if the account has never invested or has no invested amount\\n if (details.period.timestamp == 0 || investedAmount == 0) return 0;\\n\\n // Retrieve reference and data of APR checkpoint at which started investment period\\n APRH.Reference memory currRef = details.period.ref;\\n APRH.CheckpointData memory currCheckpoint = _aprHistory.getDataFromReference(currRef);\\n\\n // Retrieve reference of latest APR checkpoint\\n APRH.Reference memory latestRef = _aprHistory.getLatestReference();\\n\\n // 1) Fill rewards with virtual balance (rewards not claimed/distributed yet)\\n // See \\\"InvestUpgradeable > Yield calculation > 1)\\\" section of the whitepaper\\n rewards = details.virtualBalance;\\n\\n // If start checkpoint is not the latest one\\n if (!APRH.eq(currRef, latestRef)) {\\n // Retrieve reference and data of APR checkpoint that comes after start checkpoint\\n APRH.Reference memory nextRef = APRH.incrementReference(currRef);\\n APRH.CheckpointData memory nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // 2) Calculate rewards from investment period start to next checkpoint\\n // See \\\"InvestUpgradeable > Yield calculation > 2)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n\\n // 3) Calculate rewards for each crossed pair of checkpoints\\n // See \\\"InvestUpgradeable > Yield calculation > 3)\\\" section of the whitepaper\\n while (true) {\\n // Set next checkpoint as the current one\\n currRef = nextRef;\\n currCheckpoint = nextCheckpoint;\\n\\n // Break if current checkpoint is the latest one\\n if (APRH.eq(currRef, latestRef)) break;\\n\\n // Else, retrieve the new next checkpoint\\n nextRef = APRH.incrementReference(currRef);\\n nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\\n\\n // Calculate rewards between the current pair of checkpoints\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n nextCheckpoint.timestamp,\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n\\n // 4) Calculate rewards from the latest checkpoint to now\\n // See \\\"InvestUpgradeable > Yield calculation > 4)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n currCheckpoint.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n } else {\\n // 2.bis) Calculate rewards from investment period start to now\\n // See \\\"InvestUpgradeable > Yield calculation > 2.bis)\\\" section of the whitepaper\\n rewards += _calculatePeriodRewards(\\n details.period.timestamp,\\n uint40(block.timestamp),\\n currCheckpoint.aprUD7x3,\\n investedAmount + (autocompound ? rewards : 0)\\n );\\n }\\n }\\n\\n /**\\n * @notice Recursively resets the investment period of the specified account and of\\n * all accounts that directly or indirectly redirect rewards to this account.\\n * @param account The account to deeply reset the investment period of.\\n */\\n function _deepResetInvestmentPeriodOf(address account) internal {\\n // Reset account investment period timestamp and APR checkpoint to latest ones\\n accountsDetails[account].period.timestamp = uint40(block.timestamp);\\n accountsDetails[account].period.ref = _aprHistory.getLatestReference();\\n\\n // Also reset the ones of all accounts that recursively redirect rewards to this account\\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\\n _deepResetInvestmentPeriodOf(rewardsRedirectsToFrom[account][i]);\\n }\\n }\\n\\n /**\\n * @notice Hook to be invoked before the invested amount of an account changes. It\\n * ensures that rewards are distributed and that account's investment period is reset.\\n * @param account The account whose invested amount is going to change.\\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\\n */\\n function _beforeInvestmentChange(address account, bool autocompound) internal {\\n // This hook is called inside LToken._beforeTokenTransfer() and as new tokens are\\n // minted in LToken._distributeRewards(), this guards against infinite loop.\\n if (_isClaiming) return;\\n\\n // LToken._beforeTokenTransfer() calls this hook for both involved addresses.\\n // As first call will treat both addresses, the second call would be redundant.\\n // Therefore, we skip accounts already processed in this block to save up some gas.\\n if (accountsDetails[account].period.timestamp == uint40(block.timestamp)) return;\\n\\n // If account redirects its rewards\\n address redirectRewardsTo = rewardsRedirectsFromTo[account];\\n if (redirectRewardsTo != address(0)) {\\n // Call hook on redirection target (this will indirectly reset the investment\\n // of this source account) and return\\n _beforeInvestmentChange(redirectRewardsTo, autocompound);\\n return;\\n }\\n\\n // Else, compute account's undistributed/unclaimed rewards\\n uint256 rewards = _rewardsOf(account, autocompound);\\n\\n // If there are some rewards\\n if (rewards > 0) {\\n // Try to distribute rewards to account\\n _isClaiming = true;\\n bool distributed = _distributeRewards(account, rewards);\\n _isClaiming = false;\\n\\n // If rewards have not been distributed, accumulate them in account's virtual balance\\n if (!distributed) accountsDetails[account].virtualBalance = rewards;\\n }\\n\\n // Finally, deeply reset investment period of the account\\n _deepResetInvestmentPeriodOf(account);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xdb6d0b0e2f2546b6be0ac9244e99017c5e5da1e5b7783d6fff50f4217b9ec820\",\"license\":\"MIT\"},\"contracts/src/abstracts/RecoverableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n// Conracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"./GlobalOwnableUpgradeable.sol\\\";\\n\\n// Libraries\\nimport {SafeERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\n\\n// Interfaces\\nimport {IERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @title RecoverableUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice Derived contracts are provided with helper functions allowing the recovery of\\n * assets accidentally sent to them.\\n *\\n * @dev Where are utilities Ether, ERC721, etc.?\\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\\n * in this codebase currently do not implement the necessary functions to receive Ether\\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\\n *\\n * @dev For further details, see \\\"RecoverableUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n */\\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\\n __GlobalOwnable_init(globalOwner_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Recoverable_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Recovers a specified amount of a given token address. Will fail if the\\n * contract doesn't hold enough tokens.\\n * @param tokenAddress The address of the token to recover.\\n * @param amount The amount of token to recover.\\n */\\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\\n // Ensure the specified amount is not zero\\n require(amount > 0, \\\"L10\\\");\\n\\n // Create a reference to token's contract\\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\\n\\n // Ensure there is enough token to recover\\n require(tokenContract.balanceOf(address(this)) >= amount, \\\"L11\\\");\\n\\n // Transfer the recovered token amount to the sender\\n tokenContract.safeTransfer(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xc70110d1284c9e4aa7c518b3b98682dd9edbe6f6fb23761d825554ba41a80d5e\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\nimport {GlobalOwnableUpgradeable} from \\\"../GlobalOwnableUpgradeable.sol\\\";\\nimport {GlobalRestrictableUpgradeable} from \\\"../GlobalRestrictableUpgradeable.sol\\\";\\nimport {RecoverableUpgradeable} from \\\"../RecoverableUpgradeable.sol\\\";\\n\\n/**\\n * @title BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\\n * minimizing code repetition and enhancing readability and maintainability.\\n *\\n * @dev For further details, see \\\"Base\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract BaseUpgradeable is\\n Initializable,\\n UUPSUpgradeable,\\n GlobalOwnableUpgradeable,\\n GlobalPausableUpgradeable,\\n GlobalRestrictableUpgradeable,\\n RecoverableUpgradeable\\n{\\n /**\\n * @notice Prevents implementation contract from being initialized as recommended by\\n * OpenZeppelin.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n */\\n function __Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __GlobalOwnable_init(globalOwner_);\\n __Pausable_init();\\n __GlobalPausable_init_unchained(globalPause_);\\n __GlobalRestrictable_init_unchained(globalBlacklist_);\\n __Recoverable_init_unchained();\\n }\\n\\n function __Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\\n * global owner. It is called by the proxy contract during an upgrade.\\n * @param newImplementation The address of the new implementation contract.\\n */\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xe445c759682f31d39e63663ff8217072c0e81086bda11ea473247be334c3e424\",\"license\":\"MIT\"},\"contracts/src/abstracts/base/ERC20BaseUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\nimport {ERC20PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"./BaseUpgradeable.sol\\\";\\nimport {GlobalPausableUpgradeable} from \\\"../GlobalPausableUpgradeable.sol\\\";\\n\\n/**\\n * @title ERC20BaseUpgradeable\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This abstract contract is an extension of BaseUpgradeable intended to be used\\n * as a base for ERC20 tokens contracts.\\n *\\n * @dev For further details, see \\\"ERC20BaseUpgradeable\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nabstract contract ERC20BaseUpgradeable is\\n ERC20Upgradeable,\\n BaseUpgradeable,\\n ERC20PausableUpgradeable\\n{\\n /**\\n * @notice Initializer functions of the contract. They replace the constructor()\\n * function in the context of upgradeable contracts.\\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\\n * @param globalOwner_ The address of the GlobalOwner contract.\\n * @param globalPause_ The address of the GlobalPause contract.\\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\\n * @param name_ The display name of the token.\\n * @param symbol_ The symbol of the token.\\n */\\n function __ERC20Base_init(\\n address globalOwner_,\\n address globalPause_,\\n address globalBlacklist_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\\n __ERC20_init(name_, symbol_);\\n __ERC20Pausable_init_unchained();\\n }\\n\\n function __ERC20Base_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @notice Required override of paused() which is implemented by both\\n * GlobalPausableUpgradeable and PausableUpgradeable parent contracts.\\n * The GlobalPausableUpgradeable version is preferred because it checks the pause\\n * state from the GlobalPause contract.\\n * @inheritdoc GlobalPausableUpgradeable\\n */\\n function paused()\\n public\\n view\\n virtual\\n override(GlobalPausableUpgradeable, PausableUpgradeable)\\n returns (bool)\\n {\\n return GlobalPausableUpgradeable.paused();\\n }\\n\\n /**\\n * @dev Required override of _beforeTokenTransfer() which is implemented by both\\n * ERC20PausableUpgradeable and ERC20Upgradeable parent contracts.\\n * The ERC20PausableUpgradeable version is preferred because it also checks that\\n * the contract is not paused before allowing the transfer.\\n * @inheritdoc ERC20PausableUpgradeable\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n )\\n internal\\n virtual\\n override(ERC20PausableUpgradeable, ERC20Upgradeable)\\n whenNotPaused\\n notBlacklisted(from)\\n notBlacklisted(to)\\n {\\n ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add\\n * new variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xa69b9acca2902fcfe513889516fcffc830903fc3c6a3a11e2ad8da7460201378\",\"license\":\"MIT\"},\"contracts/src/interfaces/ITransfersListener.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\ninterface ITransfersListener {\\n function onLTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0xf1d4172da97ccaf7199601dd9bdb2ac92a49b6977ec34bba010af37f662549fb\",\"license\":\"MIT\"},\"contracts/src/libs/APRHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\n/**\\n * @title APRHistory\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice This library offers utilities to efficiently maintain the history of an\\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\\n * a \\\"checkpoint\\\".\\n *\\n * @dev Intuition:\\n * Each checkpoint in an APR history consists of two data:\\n * - the creation timestamp\\n * - the APR at that time\\n *\\n * Given that reading and writing to storage slots are among the most costly operations\\n * in Solidity, this library provides a way to store those data in a way that minimizes\\n * the number of used storage slots.\\n *\\n * Instead of storing each checkpoint in a separate storage slot, this library\\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\\n *\\n * @dev Definitions:\\n * - Checkpoint: A record of an APR change\\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\\n * - History: A dynamic array of packs\\n * - Reference: A storage pointer to a checkpoint in the APR history\\n * - CheckpointData: An in-memory representation of a checkpoint data\\n *\\n * @dev Value limitation:\\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\\n * APR in LToken contract, which is expected to remain below 10%.\\n *\\n * @dev For further details, see \\\"APRHistory\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary APRHistory {\\n /**\\n * @notice Represents data of a checkpoint extracted from the on-chain history.\\n * For on-chain representation see \\\"Pack\\\" struct.\\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\\n * @param timestamp Timestamp of the checkpoint's creation.\\n */\\n struct CheckpointData {\\n uint16 aprUD7x3; // Allows up to 65.536%\\n uint40 timestamp; // Supports dates up to 20/02/36812\\n }\\n\\n /**\\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\\n * @param aprsUD7x3 Array of checkpoints' APRs.\\n * @param timestamps Array of checkpoints' timestamps.\\n * @param cursor Index of the next checkpoint to be written.\\n */\\n struct Pack {\\n uint16[4] aprsUD7x3;\\n uint40[4] timestamps;\\n uint32 cursor;\\n }\\n\\n /**\\n * @notice Represents a storage pointer to a specific checkpoint in the history.\\n * @param packIndex Index of the pack the checkpoint belongs to.\\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\\n */\\n struct Reference {\\n uint256 packIndex;\\n uint32 cursorIndex;\\n }\\n\\n /**\\n * @notice Compares two checkpoints references.\\n * @param ref1 The first reference to compare.\\n * @param ref2 The second reference to compare.\\n * @return Whether the two references points to the same checkpoint.\\n */\\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\\n }\\n\\n /**\\n * @notice Returns the reference of the checkpoint that should come right after the\\n * referenced checkpoint in the APR history.\\n * @param ref The reference to be incremented.\\n * @return The incremented reference.\\n */\\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L1\\\");\\n\\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\\n //\\n // Else, return ref of next slot in current pack\\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\\n }\\n\\n /**\\n * @notice Extracts checkpoint data from a given reference and in APR history.\\n * @param self The APR history to extract the checkpoint from.\\n * @param ref The reference of the checkpoint data to extract.\\n * @return The extracted checkpoint's data.\\n */\\n function getDataFromReference(\\n Pack[] storage self,\\n Reference memory ref\\n ) public view returns (CheckpointData memory) {\\n // Ensure cursor index of the given ref is within valid range [0, 3]\\n require(ref.cursorIndex <= 3, \\\"L2\\\");\\n\\n // Ensure pack index of the given ref exists in history\\n require(ref.packIndex < self.length, \\\"L3\\\");\\n\\n // Retrieve pack data from history\\n Pack memory pack = self[ref.packIndex];\\n\\n // Ensure cursor index of the given ref has been written\\n require(ref.cursorIndex < pack.cursor, \\\"L4\\\");\\n\\n // Build and return the checkpoint data\\n return\\n CheckpointData({\\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\\n timestamp: pack.timestamps[ref.cursorIndex]\\n });\\n }\\n\\n /**\\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\\n * @param self The history to extract the reference from.\\n * @return The reference of the latest checkpoint.\\n */\\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\\n // Ensure the given history is not empty\\n require(self.length != 0, \\\"L5\\\");\\n\\n // Retrieve latest pack's index and cursor\\n uint256 packIndex = self.length - 1;\\n uint32 packCursor = self[packIndex].cursor;\\n\\n // If this is the first pack ever, ensure it is not empty\\n if (packIndex == 0) require(packCursor != 0, \\\"L6\\\");\\n\\n // If the pack is empty, return ref of previous pack's latest slot\\n if (packCursor == 0) return Reference(packIndex - 1, 3);\\n //\\n // Else, return ref of previous slot in current pack\\n else return Reference(packIndex, packCursor - 1);\\n }\\n\\n /**\\n * @notice Appends a new empty pack to the end of the given APR history array.\\n * @param self The APR history to append an empty to.\\n */\\n function newBlankPack(Pack[] storage self) internal {\\n // If history is not empty, ensure the latest pack is full\\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \\\"L7\\\");\\n\\n // Push a new blank pack to the history array\\n self.push(\\n Pack({\\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\\n cursor: 0\\n })\\n );\\n }\\n\\n /**\\n * @notice Write a new APR checkpoint at the end of the given history array.\\n * @param self The array of packs to write the new checkpoint to.\\n * @param aprUD7x3 The new APR in UD7x3 format.\\n */\\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\\n // Determine the reference where the new checkpoint should be written\\n Reference memory newRef = self.length == 0\\n ? Reference(0, 0)\\n : incrementReference(getLatestReference(self));\\n\\n // If pack to be written doesn't exist yet, push a new blank pack in history\\n if (newRef.packIndex >= self.length) newBlankPack(self);\\n\\n // Retrieve the pack where the new checkpoint will be stored\\n Pack memory pack = self[newRef.packIndex];\\n\\n // Add new checkpoint's data to the pack\\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\\n\\n // Increment the pack's cursor\\n pack.cursor++;\\n\\n // Write the updated pack in storage\\n self[newRef.packIndex] = pack;\\n }\\n\\n /**\\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\\n * @param self The history array to read APR from.\\n * @return The latest checkpoint's APR.\\n */\\n function getAPR(Pack[] storage self) public view returns (uint16) {\\n // Retrieve the latest checkpoint data\\n Reference memory ref = getLatestReference(self);\\n CheckpointData memory data = getDataFromReference(self, ref);\\n\\n // Return the latest checkpoint's APR\\n return data.aprUD7x3;\\n }\\n}\\n\",\"keccak256\":\"0x0b3d02a33c5e5be03cefc5192439def2efa43be664c372e83f309be34fd476b7\",\"license\":\"MIT\"},\"contracts/src/libs/SUD.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {IERC20MetadataUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\\\";\\n\\n/**\\n * @title SUD\\n * @author Lila Rest (https://lila.rest)\\n * @custom:security-contact security@ledgity.com\\n *\\n * @notice SUD serves as an intermediary number format for calculations within this\\n * codebase. It ensures consistency and reduces precision losses. This library\\n * facilitates conversions between various number formats and the SUD format.\\n *\\n * @dev Intuition:\\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\\n * represent both percentage rates and tokens amounts.\\n *\\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\\n * the decimals() value of the involved tokens.\\n *\\n * Three challenges arise from this:\\n * 1) To compute values together, it's essential that they are in the same format\\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\\n * precision loss (because division shrinks). A common approach is to scale up and\\n * down values by a few decimals before and after performing calculations.\\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\\n * be shrunk in case token's decimals number is in [0, 2].\\n *\\n * To address these challenges, this library provides the SUD format, which acts as a\\n * consistent and scaled intermediate format to perform calculations.\\n *\\n * SUD is an acronym for either \\\"Scaled UD\\\" or \\\"Safe UD\\\".\\n *\\n * @dev Definitions:\\n * - Integer: A number without fractional part, e.g., block.timestamp\\n * - UD: A decimal unsigned fixed-point number. The \\\"UD\\\" notation is inspired from\\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\\n * and fractional parts (as token amounts have variable decimal numbers)\\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\\n * with 3 more decimals than the involved UD with the highest decimals number. As\\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\\n * so ranges from UD71x6 to UD0x77 formats.\\n *\\n * @dev A conversion library:\\n * This library provides utilities to perform the following conversions:\\n * - Amount <--> SUD\\n * - Rate (UD7x3) <--> SUD\\n * - Integer <--> SUD\\n *\\n * @dev Why scaling by 3 decimals?\\n * - It provides an adequate degree of precision for this codebase,\\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\\n * the involved token's decimal number, so is gas efficient.\\n *\\n * @dev Why internal functions?\\n * The functions of this library are not set to external because incorporating them\\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\\n * from making them external are negated by the additional bytecode required for external\\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\\n * when those functions's visibility is set to external or internal.\\n *\\n * @dev Precision warning:\\n * While this library mitigates precision loss during calculations on UD numbers, it's\\n * important to note that tokens with lower decimal counts and supply inherently suffer\\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\\n * will experience less precision loss.\\n *\\n * @dev For further details, see \\\"SUD\\\" section of whitepaper.\\n * @custom:security-contact security@ledgity.com\\n */\\nlibrary SUD {\\n /**\\n * @notice Retrieves decimals number of the given ERC20 contract address.\\n * @param tokenAddress The address to retrieve decimals number from.\\n * @return decimals The decimals number of the given ERC20 contract address.\\n */\\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\\n }\\n\\n /**\\n * @notice Convert a given token amount into SUD format.\\n * @param nAmount The token amount to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The amount in SUD format\\n */\\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\\n\\n // Else return a number with decimals+3 fractional digits\\n return nAmount * 10 ** 3;\\n }\\n\\n /**\\n * @notice Convert a given SUD number into token amount format.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nAmount The number in amount format\\n */\\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** 3;\\n }\\n\\n /**\\n * @notice Converts a given UD7x3 rate into SUD format.\\n * @param nUD7x3 The UD7x3 rate to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The rate in SUD format.\\n */\\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return nUD7x3 * 10 ** 3;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return nUD7x3 * 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given SUD number into a UD7x3 rate.\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nUD7x3 The number in UD7x3 rate format.\\n */\\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 3;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** decimals;\\n }\\n\\n /**\\n * @notice Converts a given integer into SUD format.\\n * @param n The integer to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return nSUD The integer in SUD format.\\n */\\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\\n // If token decimals < 3, return a UD71x6 number\\n if (decimals < 3) return n * 10 ** 6;\\n\\n // Else, return a number with decimals+3 fractional digits\\n return n * 10 ** (decimals + 3);\\n }\\n\\n /**\\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\\n * @param nSUD The SUD number to convert.\\n * @param decimals The decimals number of the involved ERC20 token.\\n * @return n The SUD number as an integer.\\n */\\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\\n // If token decimals < 3, convert from a UD71x6 number\\n if (decimals < 3) return nSUD / 10 ** 6;\\n\\n // Else, convert from a number with decimals+3 fractional digits\\n return nSUD / 10 ** (decimals + 3);\\n }\\n}\\n\",\"keccak256\":\"0x7297fc67064b5925e26fa5ed3a4ba4b0f64a9162fdf0ebc2aac8649fddce543a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051615f916200011f60003960008181611462015281816114a2015281816118fd0152818161193d01526119d00152615f916000f3fe6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff82166024820152730165878A594ca255338adfa4d48449f69242Eb8F9063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b81526102906004820152600090730165878A594ca255338adfa4d48449f69242Eb8F9063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b8152610290600482015260006024820152730165878A594ca255338adfa4d48449f69242Eb8F9063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b8152600090730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b81526102906004820152909150600090730165878A594ca255338adfa4d48449f69242Eb8F90630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b905084602001519550730165878A594ca255338adfa4d48449f69242Eb8F634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b8152600090730165878A594ca255338adfa4d48449f69242Eb8F90637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b8152909150600090730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b819450809350730165878A594ca255338adfa4d48449f69242Eb8F634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b8152730165878A594ca255338adfa4d48449f69242Eb8F90637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b8152909250730165878A594ca255338adfa4d48449f69242Eb8F9063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b81526102906004820152730165878A594ca255338adfa4d48449f69242Eb8F90630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a2646970667358221220c4b56974d7bcc9a4b8cde298dda0e7d864971d84befea21a0bd2d57f41d36f4364736f6c63430008120033", + "deployedBytecode": "0x6080604052600436106103d95760003560e01c80638980f11f116101fd578063c822adda11610118578063dd62ed3e116100ab578063ef356a791161007a578063ef356a7914610b96578063f12d54d814610bab578063f2fde38b14610bca578063f762e73414610bea578063f94ce2c214610c0957600080fd5b8063dd62ed3e14610b11578063ee1335d114610b31578063ee153c4f14610b51578063ef2591af14610b7157600080fd5b8063d038875c116100e7578063d038875c14610a8d578063d039981b14610ac7578063d294f09314610ae7578063db84faac14610afc57600080fd5b8063c822adda14610a05578063c89d5b8b14610a25578063cafb220214610a4d578063cdc1842414610a6c57600080fd5b8063a457c2d711610190578063b2de2a431161015f578063b2de2a431461097a578063b60d42881461098f578063b6b55f25146109b0578063bacd609e146109d057600080fd5b8063a457c2d7146108fa578063a64c91cc1461091a578063a8f763201461093a578063a9059cbb1461095a57600080fd5b806395d89b41116101cc57806395d89b411461089257806399a03c70146108a75780639c271975146108c75780639ee679e8146108e757600080fd5b80638980f11f146108065780638d8e6bd7146108265780638da5cb5b1461085d57806392e5ced71461087257600080fd5b80634134bee9116102f85780636d3a4ac81161028b578063734d82871161025a578063734d8287146107795780637594d0b51461079057806375a5652b146107a75780637c2edb16146107c75780638370e1f7146107e657600080fd5b80636d3a4ac8146107055780636f307dc31461072557806370a0823114610744578063715018a61461076457600080fd5b806353ac4b66116102c757806353ac4b661461067257806353d3a42f146106895780635c975abb146106d05780635f0e8e37146106e557600080fd5b80634134bee91461060a57806345b05d091461062a5780634f1ef2861461064a57806352d1902d1461065d57600080fd5b806323b872dd116103705780633659cfe61161033f5780633659cfe614610571578063391d85ec1461059157806339509351146105ca5780633e7ae353146105ea57600080fd5b806323b872dd146104f55780632a1b8b1c146105155780632f4f21e21461052a578063313ce5671461054a57600080fd5b80631459457a116103ac5780631459457a1461047b57806318160ddd1461049b5780631c19be6d146104be578063205c2878146104d557600080fd5b806306fdde03146103de578063095ea7b3146104095780630d174c24146104395780630e21750f1461045b575b600080fd5b3480156103ea57600080fd5b506103f3610c29565b604051610400919061549e565b60405180910390f35b34801561041557600080fd5b506104296104243660046154e6565b610cbb565b6040519015158152602001610400565b34801561044557600080fd5b50610459610454366004615512565b610cd5565b005b34801561046757600080fd5b50610459610476366004615512565b610d41565b34801561048757600080fd5b5061045961049636600461552f565b610da8565b3480156104a757600080fd5b506104b061100c565b604051908152602001610400565b3480156104ca57600080fd5b506104b06102fe5481565b3480156104e157600080fd5b506104296104f03660046154e6565b611037565b34801561050157600080fd5b506104296105103660046155a0565b611068565b34801561052157600080fd5b5061045961108e565b34801561053657600080fd5b506104296105453660046154e6565b61141d565b34801561055657600080fd5b5061055f61144e565b60405160ff9091168152602001610400565b34801561057d57600080fd5b5061045961058c366004615512565b611458565b34801561059d57600080fd5b506102f9546105b2906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156105d657600080fd5b506104296105e53660046154e6565b611537565b3480156105f657600080fd5b506105b26106053660046154e6565b611559565b34801561061657600080fd5b506104596106253660046155e1565b611592565b34801561063657600080fd5b506104596106453660046155e1565b611786565b610459610658366004615692565b6118f3565b34801561066957600080fd5b506104b06119c3565b34801561067e57600080fd5b506104b06102fd5481565b34801561069557600080fd5b506106a96106a43660046155e1565b611a76565b604080516001600160a01b0390931683526001600160601b03909116602083015201610400565b3480156106dc57600080fd5b50610429611ab2565b3480156106f157600080fd5b50610459610700366004615512565b611abc565b34801561071157600080fd5b50610459610720366004615735565b611c13565b34801561073157600080fd5b506102c6546001600160a01b03166105b2565b34801561075057600080fd5b506104b061075f366004615512565b611cc4565b34801561077057600080fd5b50610459611ce2565b34801561078557600080fd5b506104b06102fc5481565b34801561079c57600080fd5b506104b06103005481565b3480156107b357600080fd5b506104596107c23660046155e1565b611d18565b3480156107d357600080fd5b50610193546001600160a01b03166105b2565b3480156107f257600080fd5b506104596108013660046155e1565b6120d4565b34801561081257600080fd5b506104596108213660046154e6565b612258565b34801561083257600080fd5b506105b2610841366004615512565b610291602052600090815260409020546001600160a01b031681565b34801561086957600080fd5b506105b26122bd565b34801561087e57600080fd5b5061045961088d366004615752565b61232c565b34801561089e57600080fd5b506103f3612563565b3480156108b357600080fd5b506104b06108c2366004615512565b612572565b3480156108d357600080fd5b506104596108e2366004615512565b612590565b6104596108f53660046155e1565b6125eb565b34801561090657600080fd5b506104296109153660046154e6565b612952565b34801561092657600080fd5b50610459610935366004615512565b6129d8565b34801561094657600080fd5b50610459610955366004615752565b612a03565b34801561096657600080fd5b506104296109753660046154e6565b612d39565b34801561098657600080fd5b50610459612d47565b34801561099b57600080fd5b506102fb546105b2906001600160a01b031681565b3480156109bc57600080fd5b506104596109cb3660046155e1565b612e30565b3480156109dc57600080fd5b506109f06109eb3660046154e6565b612f87565b60408051928352602083019190915201610400565b348015610a1157600080fd5b506106a9610a203660046155e1565b6130a3565b348015610a3157600080fd5b50610a3a6130b4565b60405161ffff9091168152602001610400565b348015610a5957600080fd5b5061028e546001600160a01b03166105b2565b348015610a7857600080fd5b506102fa546105b2906001600160a01b031681565b348015610a9957600080fd5b506102fb54610ab290600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610400565b348015610ad357600080fd5b506104b0610ae2366004615512565b61312c565b348015610af357600080fd5b50610459613139565b348015610b0857600080fd5b506104b06131fa565b348015610b1d57600080fd5b506104b0610b2c366004615752565b613281565b348015610b3d57600080fd5b50610459610b4c36600461579d565b6132ac565b348015610b5d57600080fd5b506105b2610b6c3660046155e1565b613319565b348015610b7d57600080fd5b506102fb54610ab290600160c01b900463ffffffff1681565b348015610ba257600080fd5b506104b0613344565b348015610bb757600080fd5b50610160546001600160a01b03166105b2565b348015610bd657600080fd5b50610459610be5366004615512565b61334f565b348015610bf657600080fd5b5061012d546001600160a01b03166105b2565b348015610c1557600080fd5b50610459610c2436600461579d565b613384565b6060609a8054610c38906157ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610c64906157ba565b8015610cb15780601f10610c8657610100808354040283529160200191610cb1565b820191906000526020600020905b815481529060010190602001808311610c9457829003601f168201915b5050505050905090565b600033610cc98185856133f1565b60019150505b92915050565b610cdd613515565b6001600160a01b038116610d1e5760405162461bcd60e51b81526020600482015260036024820152624c363360e81b60448201526064015b60405180910390fd5b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055565b610d49613515565b6001600160a01b038116610d855760405162461bcd60e51b8152602060048201526003602482015262130d8d60ea1b6044820152606401610d15565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1615808015610dc85750600054600160ff909116105b80610de25750303b158015610de2575060005460ff166001145b610e455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d15565b6000805460ff191660011790558015610e68576000805461ff0019166101001790555b6000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed091908101906157ee565b9050610f1d87878784604051602001610ee99190615865565b60405160208183030381529060405285604051602001610f099190615895565b604051602081830303815290604052613576565b610f26836135ba565b610f2f306135ea565b6102f980546001600160a01b0319166001600160a01b0386161790556102fb805467ffffffffffffffff60a01b19166509c40000004b60a21b179055610f736122bd565b6102fa80546001600160a01b0319166001600160a01b0392909216919091179055610f9c6122bd565b6102fb80546001600160a01b0319166001600160a01b0392909216919091179055508015611004576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006102fc546102fd5461101e613344565b61102891906158d4565b61103291906158d4565b905090565b60405162461bcd60e51b81526020600482015260036024820152624c343560e81b6044820152600090606401610d15565b600033611076858285613694565b61108185858561370e565b60019150505b9392505050565b6102fa546001600160a01b0316336001600160a01b0316146110d85760405162461bcd60e51b81526020600482015260036024820152624c333960e81b6044820152606401610d15565b6110e06138ca565b610300546102ff5460009182915b808210156113c05761afc85a106113c05760006102ff8381548110611115576111156158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150156113ad57805161116490613912565b156111e6576102ff838154811061117d5761117d6158e7565b60009182526020808320909101829055610301805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177fe78f8e39db67a8c6e0d54c288efc6f296f5d558bc028138a8476c9b97f6fcaa4909101556113ad565b60026111f06131fa565b6111fa91906158fd565b81602001516001600160601b031611156112c65760208101516102ff5460405160019233928792600080516020615f3c833981519152926112419290918291600391615941565b60405180910390a46102ff838154811061125d5761125d6158e7565b600091825260208083209091018290556102ff805460018101825592528251908301516001600160601b0316600160a01b026001600160a01b0391909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec909101556113ad565b6000806112e4836000015184602001516001600160601b0316612f87565b91509150856102fe546112f79190615975565b821115611306575050506113c0565b61131081886158d4565b965061131c82876158d4565b9550600183600001516001600160a01b031686600080516020615f3c83398151915286602001518660026000196040516113599493929190615988565b60405180910390a46102ff8581548110611375576113756158e7565b600091825260208220015582516113aa908361139a6102c6546001600160a01b031690565b6001600160a01b03169190613982565b50505b826113b7816159ac565b935050506110ee565b836102fc60008282546113d391906158d4565b92505081905550826102fe60008282546113ed9190615975565b909155506113fd905084846158d4565b6102fd600082825461140f9190615975565b909155505050610300555050565b60405162461bcd60e51b8152602060048201526003602482015262261a1b60e91b6044820152600090606401610d15565b60006110326139e5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a05760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114e9600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b03161461150f5760405162461bcd60e51b8152600401610d1590615a11565b61151881613a5b565b6040805160008082526020820190925261153491839190613a63565b50565b600033610cc981858561154a8383613281565b61155491906158d4565b6133f1565b610292602052816000526040600020818154811061157657600080fd5b6000918252602090912001546001600160a01b03169150829050565b61159a6138ca565b336115a481613912565b156115c15760405162461bcd60e51b8152600401610d1590615a5d565b6115ca33611cc4565b8211156115ff5760405162461bcd60e51b815260206004820152600360248201526209868760eb1b6044820152606401610d15565b60006102fe54836102fd5461161491906158d4565b6102f95491101591506000906002906001600160a01b031663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a9190615a79565b101580156116ab57506102fe548411155b905081806116b65750805b6116e85760405162461bcd60e51b81526020600482015260036024820152624c343960e81b6044820152606401610d15565b6000806116f53387612f87565b91509150806102fc600082825461170c91906158d4565b92505081905550816102fe60008282546117269190615975565b9091555060019050336001600160a01b0316600019600080516020615f3c833981519152898660026000196040516117619493929190615a92565b60405180910390a46117733382613bce565b61177d3383613d15565b50505050505050565b61178e6138ca565b3361179881613912565b156117b55760405162461bcd60e51b8152600401610d1590615a5d565b60006102ff83815481106117cb576117cb6158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150336001600160a01b0316146118475760405162461bcd60e51b81526020600482015260036024820152624c353760e81b6044820152606401610d15565b80602001516001600160601b03166102fd60008282546118679190615975565b90915550506102ff805484908110611881576118816158e7565b6000918252602082200155600181600001516001600160a01b031684600080516020615f3c8339815191528460200151856020015160016000196040516118cb9493929190615941565b60405180910390a46118ee816000015182602001516001600160601b0316613d42565b505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361193b5760405162461bcd60e51b8152600401610d15906159c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611984600080516020615ef5833981519152546001600160a01b031690565b6001600160a01b0316146119aa5760405162461bcd60e51b8152600401610d1590615a11565b6119b382613a5b565b6119bf82826001613a63565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a635760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610d15565b50600080516020615ef583398151915290565b6103018181548110611a8757600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611032613e17565b611ac4613515565b610302546000199060005b81811015611b2957836001600160a01b03166103028281548110611af557611af56158e7565b6000918252602090912001546001600160a01b031603611b1757809250611b29565b80611b21816159ac565b915050611acf565b506000198213611b615760405162461bcd60e51b8152602060048201526003602482015262261a1960e91b6044820152606401610d15565b610302611b6f600183615975565b81548110611b7f57611b7f6158e7565b60009182526020909120015461030280546001600160a01b039092169184908110611bac57611bac6158e7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610302805480611bec57611bec615aad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611c1b613515565b60405163433e3bad60e11b8152610290600482015261ffff8216602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b158015611c7157600080fd5b505af4158015611c85573d6000803e3d6000fd5b505060405161ffff841681527f3d6d63f501ae621a01c729938fb4428a25138835257943d6b56c49b402ba36329250602001905060405180910390a150565b6000611ccf8261312c565b611cd883612572565b610ccf91906158d4565b611cea613515565b60405162461bcd60e51b81526020600482015260036024820152624c363560e81b6044820152606401610d15565b6102fb546001600160a01b0316336001600160a01b031614611d625760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b611d6a6138ca565b60006102ff8281548110611d8057611d806158e7565b6000918252602091829020604080518082019091529101546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092529150611df15760405162461bcd60e51b8152602060048201526003602482015262261b1b60e91b6044820152606401610d15565b8051611dfc90613912565b15611e2f5760405162461bcd60e51b815260206004820152600360248201526204c35360ec1b6044820152606401610d15565b6002611e396131fa565b611e4391906158fd565b81602001516001600160601b031611611e845760405162461bcd60e51b81526020600482015260036024820152624c353160e81b6044820152606401610d15565b600080611ea2836000015184602001516001600160601b0316612f87565b915091506000611ebb6102c6546001600160a01b031690565b6102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190615a79565b9050806102fe54611f3a91906158d4565b831115611f6f5760405162461bcd60e51b8152602060048201526003602482015262261a9960e91b6044820152606401610d15565b816102fc6000828254611f8291906158d4565b9250508190555083602001516001600160601b03166102fd6000828254611fa99190615975565b9091555050610300548503611fcf576103008054906000611fc9836159ac565b91905055505b600184600001516001600160a01b031686600080516020615f3c833981519152876020015187600260001960405161200a9493929190615988565b60405180910390a46102ff8581548110612026576120266158e7565b600091825260208220015580831161206857612063338551856120526102c6546001600160a01b031690565b6001600160a01b0316929190613e86565b6120c5565b60006120748285615975565b9050806102fe60008282546120899190615975565b909155506120a99050338651846120526102c6546001600160a01b031690565b84516120c3908261139a6102c6546001600160a01b031690565b505b6120cd613ebe565b5050505050565b6102fb546001600160a01b0316336001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600360248201526204c34360ec1b6044820152606401610d15565b6121266138ca565b6102c6546001600160a01b03166102fb546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190615a79565b8111156121d65760405162461bcd60e51b81526020600482015260036024820152620986a760eb1b6044820152606401610d15565b6000816102fe546121e791906158d4565b90506121f16131fa565b8111156122265760405162461bcd60e51b81526020600482015260036024820152624c353960e81b6044820152606401610d15565b816102fe600082825461223991906158d4565b909155506119bf90503330846120526102c6546001600160a01b031690565b612260613515565b6102c6546001600160a01b03166001600160a01b0316826001600160a01b0316036122b35760405162461bcd60e51b81526020600482015260036024820152624c343360e81b6044820152606401610d15565b6119bf8282613f27565b61012d5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015612308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615ac3565b6123346138ca565b8161233e81613912565b1561235b5760405162461bcd60e51b8152600401610d1590615a5d565b8161236581613912565b156123825760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038481166000908152610291602052604090205416156123d15760405162461bcd60e51b8152602060048201526003602482015262261b1960e91b6044820152606401610d15565b6001600160a01b03841661240d5760405162461bcd60e51b815260206004820152600360248201526226189960e91b6044820152606401610d15565b6001600160a01b0383166124495760405162461bcd60e51b81526020600482015260036024820152624c313360e81b6044820152606401610d15565b826001600160a01b0316846001600160a01b0316036124905760405162461bcd60e51b8152602060048201526003602482015262130c4d60ea1b6044820152606401610d15565b6124986122bd565b6001600160a01b0316336001600160a01b031614806124bf5750336001600160a01b038516145b6124f15760405162461bcd60e51b81526020600482015260036024820152624c313560e81b6044820152606401610d15565b6124fc846001614019565b612507836001614019565b50506001600160a01b039182166000818152610291602090815260408083208054969095166001600160a01b03199687168117909555938252610292815292812080546001810182559082529290209091018054909216179055565b6060609b8054610c38906157ba565b6001600160a01b038116600090815260976020526040812054610ccf565b612598613515565b61030280546001810182556000919091527f552430c2010355dda19e8bae437f75cfb136cb8d667c4c0867367db21eee69b60180546001600160a01b0319166001600160a01b0392909216919091179055565b6125f36138ca565b336125fd81613912565b1561261a5760405162461bcd60e51b8152600401610d1590615a5d565b61262333611cc4565b8211156126585760405162461bcd60e51b81526020600482015260036024820152624c353360e81b6044820152606401610d15565b6001600160601b038211156126955760405162461bcd60e51b8152602060048201526003602482015262130d4d60ea1b6044820152606401610d15565b34660aa87bee538000146126d15760405162461bcd60e51b81526020600482015260036024820152624c353560e81b6044820152606401610d15565b600060405180604001604052806126e53390565b6001600160a01b0390811682526001600160601b0386166020909201919091526102f9549192506000916002911663c8f74bb8336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190615a79565b101580156127925750600061030054115b156128005761030080549060006127a883615ae0565b9190505550610300549050816102ff82815481106127c8576127c86158e7565b6000918252602091829020835193909201516001600160601b0316600160a01b026001600160a01b039093169290921791015561286a565b6102ff8054600181810183556000839052845160208601516001600160601b0316600160a01b026001600160a01b03909116177f5a4a1f748f8cfa795b59cdc37192794ee567e6029e925719381be08d7ccaf4ec9092019190915590546128679190615975565b90505b836102fd600082825461287d91906158d4565b9091555060019050336001600160a01b031682600080516020615f3c833981519152878860006000196040516128b69493929190615a92565b60405180910390a46128c83385613bce565b6102fa546040516000916001600160a01b03169034908381818185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50509050806120cd5760405162461bcd60e51b8152602060048201526003602482015262261a9b60e91b6044820152606401610d15565b600033816129608286613281565b9050838110156129c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d15565b6129cd82868684036133f1565b506001949350505050565b6129e0613515565b6102f980546001600160a01b0319166001600160a01b0392909216919091179055565b612a0b6138ca565b81612a1581613912565b15612a325760405162461bcd60e51b8152600401610d1590615a5d565b81612a3c81613912565b15612a595760405162461bcd60e51b8152600401610d1590615a5d565b6001600160a01b038416612a955760405162461bcd60e51b815260206004820152600360248201526226189b60e91b6044820152606401610d15565b6001600160a01b038316612ad15760405162461bcd60e51b81526020600482015260036024820152624c313760e81b6044820152606401610d15565b612ad96122bd565b6001600160a01b0316336001600160a01b03161480612b005750336001600160a01b038516145b612b325760405162461bcd60e51b815260206004820152600360248201526209862760eb1b6044820152606401610d15565b6001600160a01b0384811660009081526102916020526040902054811690841614612b855760405162461bcd60e51b81526020600482015260036024820152624c313960e81b6044820152606401610d15565b612b90846001614019565b612b9b836001614019565b60001960005b6001600160a01b03851660009081526102926020526040902054811015612c26576001600160a01b0385811660009081526102926020526040902080549188169183908110612bf257612bf26158e7565b6000918252602090912001546001600160a01b031603612c1457809150612c26565b80612c1e816159ac565b915050612ba1565b506000811215612c3857612c38615af7565b6001600160a01b0380861660009081526102916020908152604080832080546001600160a01b031916905592871682526102929052208054612c7c90600190615975565b81548110612c8c57612c8c6158e7565b60009182526020808320909101546001600160a01b0387811684526102929092526040909220805491909216919083908110612cca57612cca6158e7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918616815261029290915260409020805480612d1057612d10615aad565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600033610cc981858561370e565b612d4f613515565b60006102fe54612d686102c6546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd29190615a79565b612ddc9190615975565b905060008111612e145760405162461bcd60e51b8152602060048201526003602482015262130d0d60ea1b6044820152606401610d15565b611534612e2a6102c6546001600160a01b031690565b82613f27565b612e386138ca565b33612e4281613912565b15612e5f5760405162461bcd60e51b8152600401610d1590615a5d565b81612e736102c6546001600160a01b031690565b6001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eea9190615a79565b1015612f1e5760405162461bcd60e51b81526020600482015260036024820152624c343760e81b6044820152606401610d15565b816102fe6000828254612f3191906158d4565b9091555060009050336001600160a01b0316600019600080516020615f3c83398151915285866002600019604051612f6c9493929190615a92565b60405180910390a4612f7e33836140ee565b506119bf613ebe565b6102f95460405163191ee97760e31b81526001600160a01b03848116600483015260009283926002929091169063c8f74bb890602401602060405180830381865afa158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190615a79565b1061300e5750819050600061309c565b600061302b61302661028e546001600160a01b031690565b61416f565b9050600061303985836141dc565b6102fb5490915060009061305a90600160a01b900463ffffffff168461421a565b90506000613069606485614246565b6130738385615b0d565b61307d91906158fd565b90506130898185614274565b94506130958588615975565b9550505050505b9250929050565b6102ff8181548110611a8757600080fd5b60405163106d64cf60e31b8152610290600482015260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063836b267890602401602060405180830381865af4158015613108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b24565b6000610ccf8260016142ab565b613141613515565b60006102fc541161317a5760405162461bcd60e51b815260206004820152600360248201526204c36360ec1b6044820152606401610d15565b6102fc546102fe5410156131b65760405162461bcd60e51b81526020600482015260036024820152624c363160e81b6044820152606401610d15565b6102fc546102fe60008282546131cc9190615975565b90915550506102fc805460009091556115346131e66122bd565b8261139a6102c6546001600160a01b031690565b60008061321361302661028e546001600160a01b031690565b9050600061322861322261100c565b836141dc565b6102fb5490915060009061324990600160c01b900463ffffffff168461421a565b90506000613258606485614246565b6132628385615b0d565b61326c91906158fd565b90506132788185614274565b94505050505090565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b6132b4613515565b614e2063ffffffff821611156132f25760405162461bcd60e51b815260206004820152600360248201526209870760eb1b6044820152606401610d15565b6102fb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b610302818154811061332a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061103260995490565b613357613515565b60405162461bcd60e51b8152602060048201526002602482015261098760f31b6044820152606401610d15565b61338c613515565b61271063ffffffff821611156133ca5760405162461bcd60e51b81526020600482015260036024820152624c343160e81b6044820152606401610d15565b6102fb805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b0383166134535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d15565b6001600160a01b0382166134b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d15565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361351e6122bd565b6001600160a01b0316146135745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d15565b565b600054610100900460ff1661359d5760405162461bcd60e51b8152600401610d1590615b41565b6135a8858585614811565b6135b2828261486b565b6120cd61489c565b600054610100900460ff166135e15760405162461bcd60e51b8152600401610d1590615b41565b611534816148c3565b600054610100900460ff166136115760405162461bcd60e51b8152600401610d1590615b41565b61028e80546001600160a01b0319166001600160a01b03831617905560405163433e3bad60e11b815261029060048201526000602482015273__$3728f51d90da6977d2525dcec632daa0b3$__9063867c775a9060440160006040518083038186803b15801561368057600080fd5b505af41580156120cd573d6000803e3d6000fd5b60006136a08484613281565b9050600019811461370857818110156136fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d15565b61370884848484036133f1565b50505050565b6001600160a01b0383166137725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d15565b6001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d15565b6137df838383614965565b6001600160a01b038316600090815260976020526040902054818110156138575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d15565b6001600160a01b0380851660008181526097602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138b79086815260200190565b60405180910390a36137088484846149a4565b6138d2611ab2565b156135745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d15565b6101935460405163fe575a8760e01b81526001600160a01b038381166004830152600092169063fe575a8790602401602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf9190615b8c565b6040516001600160a01b0383166024820152604481018290526118ee90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614aad565b6102c6546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa925050508015613a4c575060408051601f3d908101601f19168201909252613a4991810190615bae565b60015b613a565750601290565b919050565b611534613515565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613a96576118ee83614b82565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613af0575060408051601f3d908101601f19168201909252613aed91810190615a79565b60015b613b535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610d15565b600080516020615ef58339815191528114613bc25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610d15565b506118ee838383614c1e565b6001600160a01b038216613c2e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d15565b613c3a82600083614965565b6001600160a01b03821660009081526097602052604090205481811015613cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d15565b6001600160a01b03831660008181526097602090815260408083208686039055609980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118ee836000846149a4565b6000613d213383613bce565b6102c654613d39906001600160a01b03168484613982565b50600192915050565b6001600160a01b038216613d985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d15565b613da460008383614965565b8060996000828254613db691906158d4565b90915550506001600160a01b0382166000818152609760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119bf600083836149a4565b6101605460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015613e62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110329190615b8c565b6040516001600160a01b03808516602483015283166044820152606481018290526137089085906323b872dd60e01b906084016139ae565b6000613ec86131fa565b9050806102fe5411613ed75750565b6000816102fe54613ee89190615975565b9050806102fe6000828254613efd9190615975565b90915550506102fb546119bf906001600160a01b03168261139a6102c6546001600160a01b031690565b613f2f613515565b60008111613f655760405162461bcd60e51b815260206004820152600360248201526204c31360ec1b6044820152606401610d15565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd19190615a79565b10156140055760405162461bcd60e51b81526020600482015260036024820152624c313160e81b6044820152606401610d15565b6118ee6001600160a01b0382163384613982565b6102935460ff1615614029575050565b6001600160a01b038216600090815261028f602052604090205464ffffffffff428116911603614057575050565b6001600160a01b0380831660009081526102916020526040902054168015614083576118ee8183614019565b600061408f84846142ab565b905080156140e557610293805460ff1916600117905560006140b18583614c43565b610293805460ff191690559050806140e3576001600160a01b038516600090815261028f602052604090206003018290555b505b61370884614c9a565b60003330810361414c5760405162461bcd60e51b815260206004820152602360248201527f4552433230577261707065723a20777261707065722063616e2774206465706f6044820152621cda5d60ea1b6064820152608401610d15565b6102c654614165906001600160a01b0316823086613e86565b610cc98484613d42565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d39190615bae565b60ff1692915050565b6000600382101561420e576141f2826006615975565b6141fd90600a615cb5565b6142079084615b0d565b9050610ccf565b611087836103e8615b0d565b6000600382101561423157614207836103e8615b0d565b61423c82600a615cb5565b6110879084615b0d565b6000600382101561425e5761420783620f4240615b0d565b6142698260036158d4565b61423c90600a615cb5565b6000600382101561429f5761428a826006615975565b61429590600a615cb5565b61420790846158fd565b6110876103e8846158fd565b6001600160a01b038216600090815261028f602090815260408083208151608081018352815464ffffffffff16818401908152835180850190945260018301548452600283015463ffffffff1684860152606082019390935291825260030154918101919091528161431c85614dfc565b82515190915064ffffffffff161580614333575080155b1561434357600092505050610ccf565b815160200151604051630b27cfb160e31b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061438790610290908690600401615cc1565b6040805180830381865af41580156143a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c79190615ce5565b60405163038255fd60e11b8152610290600482015290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af415801561441d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144419190615d30565b90508460200151955073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5384836040518363ffffffff1660e01b8152600401614483929190615d5c565b602060405180830381865af41580156144a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c49190615b8c565b6147d557604051633e1e5c5360e11b815260009073__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a690614502908790600401615d90565b6040805180830381865af415801561451e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145429190615d30565b604051630b27cfb160e31b815290915060009073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061458390610290908690600401615cc1565b6040805180830381865af415801561459f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c39190615ce5565b875151602082015186519293506145f1928c6145e05760006145e2565b8b5b6145ec908b6158d4565b614ea5565b6145fb90896158d4565b97505b81945080935073__$3728f51d90da6977d2525dcec632daa0b3$__634ead0c5386856040518363ffffffff1660e01b815260040161463d929190615d5c565b602060405180830381865af415801561465a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467e9190615b8c565b6147a857604051633e1e5c5360e11b815273__$3728f51d90da6977d2525dcec632daa0b3$__90637c3cb8a6906146b9908890600401615d90565b6040805180830381865af41580156146d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f99190615d30565b604051630b27cfb160e31b815290925073__$3728f51d90da6977d2525dcec632daa0b3$__9063593e7d889061473790610290908690600401615cc1565b6040805180830381865af4158015614753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147779190615ce5565b90506147978460200151826020015186600001518c6145e05760006145e2565b6147a190896158d4565b97506145fe565b6147c284602001514286600001518c6145e05760006145e2565b6147cc90896158d4565b97505050614806565b84515182516147f9919042908a6147ed5760006147ef565b895b6145ec90896158d4565b61480390876158d4565b95505b505050505092915050565b600054610100900460ff166148385760405162461bcd60e51b8152600401610d1590615b41565b61484061489c565b61484983614f91565b614851614fc1565b61485a82614ff0565b6148638161503a565b6118ee61489c565b600054610100900460ff166148925760405162461bcd60e51b8152600401610d1590615b41565b6119bf8282615084565b600054610100900460ff166135745760405162461bcd60e51b8152600401610d1590615b41565b600054610100900460ff166148ea5760405162461bcd60e51b8152600401610d1590615b41565b306001600160a01b038216036149425760405162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a2063616e6e6f742073656c66207772617000006044820152606401610d15565b6102c680546001600160a01b0319166001600160a01b0392909216919091179055565b6149708383836150c4565b6001600160a01b0383161561498a5761498a836001614019565b6001600160a01b038216156118ee576118ee826001614019565b6001600160a01b03831615806149c157506001600160a01b038216155b15614a01577f980f7e6fb44009001d533a10bc3bd558b4efe22dcb4888bca4767aa93c71ce1f6149ef61100c565b60405190815260200160405180910390a15b60005b61030254811015613708576103028181548110614a2357614a236158e7565b600091825260209091200154604051636e0d037d60e11b81526001600160a01b0386811660048301528581166024830152604482018590529091169063dc1a06fa90606401600060405180830381600087803b158015614a8257600080fd5b505af1158015614a96573d6000803e3d6000fd5b505050508080614aa5906159ac565b915050614a04565b6000614b02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151259092919063ffffffff16565b9050805160001480614b23575080806020019051810190614b239190615b8c565b6118ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d15565b6001600160a01b0381163b614bef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610d15565b600080516020615ef583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614c2783615134565b600082511180614c345750805b156118ee576137088383615174565b6000826001600160a01b03167f05a71d417f891ba4b7a94b48d1b1f4b59b070921cba593b3c72a05a5587a78a9614c7985612572565b60408051918252602082018690520160405180910390a2613d398383613d42565b6001600160a01b038116600090815261028f602052604090819020805464ffffffffff19164264ffffffffff161790555163038255fd60e11b8152610290600482015273__$3728f51d90da6977d2525dcec632daa0b3$__90630704abfa906024016040805180830381865af4158015614d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3c9190615d30565b6001600160a01b038216600090815261028f602090815260408220835160018201559201516002909201805463ffffffff191663ffffffff909316929092179091555b6001600160a01b038216600090815261029260205260409020548110156119bf576001600160a01b0382166000908152610292602052604090208054614dea919083908110614dd057614dd06158e7565b6000918252602090912001546001600160a01b0316614c9a565b80614df4816159ac565b915050614d7f565b6000614e0782615199565b614e1190826158d4565b905060005b6001600160a01b03831660009081526102926020526040902054811015614e9f576001600160a01b0383166000908152610292602052604090208054614e81919083908110614e6757614e676158e7565b6000918252602090912001546001600160a01b0316614dfc565b614e8b90836158d4565b915080614e97816159ac565b915050614e16565b50919050565b600080614ebe61302661028e546001600160a01b031690565b90506000614edc614ecf8888615dad565b64ffffffffff1683614246565b90506000614eee6301e1338084614246565b614ef9600185614246565b614f039084615b0d565b614f0d91906158fd565b90506000614f1f8761ffff168561421a565b90506000614f2e600186614246565b614f388385615b0d565b614f4291906158fd565b90506000614f5088876141dc565b90506000614f5f606488614246565b614f698484615b0d565b614f7391906158fd565b9050614f7f8188614274565b9750505050505050505b949350505050565b600054610100900460ff16614fb85760405162461bcd60e51b8152600401610d1590615b41565b611534816151a4565b600054610100900460ff16614fe85760405162461bcd60e51b8152600401610d1590615b41565b6135746151ee565b600054610100900460ff166150175760405162461bcd60e51b8152600401610d1590615b41565b61016080546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150615760405162461bcd60e51b8152600401610d1590615b41565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166150ab5760405162461bcd60e51b8152600401610d1590615b41565b609a6150b78382615e18565b50609b6118ee8282615e18565b6150cc6138ca565b826150d681613912565b156150f35760405162461bcd60e51b8152600401610d1590615a5d565b826150fd81613912565b1561511a5760405162461bcd60e51b8152600401610d1590615a5d565b6120cd858585615221565b6060614f898484600085615289565b61513d81614b82565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606110878383604051806060016040528060278152602001615f1560279139615364565b6000610ccf82612572565b600054610100900460ff166151cb5760405162461bcd60e51b8152600401610d1590615b41565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166152155760405162461bcd60e51b8152600401610d1590615b41565b60c9805460ff19169055565b615229611ab2565b156118ee5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610d15565b6060824710156152ea5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d15565b600080866001600160a01b031685876040516153069190615ed8565b60006040518083038185875af1925050503d8060008114615343576040519150601f19603f3d011682016040523d82523d6000602084013e615348565b606091505b5091509150615359878383876153dc565b979650505050505050565b6060600080856001600160a01b0316856040516153819190615ed8565b600060405180830381855af49150503d80600081146153bc576040519150601f19603f3d011682016040523d82523d6000602084013e6153c1565b606091505b50915091506153d2868383876153dc565b9695505050505050565b6060831561544b578251600003615444576001600160a01b0385163b6154445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d15565b5081614f89565b614f8983838151156154605781518083602001fd5b8060405162461bcd60e51b8152600401610d15919061549e565b60005b8381101561549557818101518382015260200161547d565b50506000910152565b60208152600082518060208401526154bd81604085016020870161547a565b601f01601f19169190910160400192915050565b6001600160a01b038116811461153457600080fd5b600080604083850312156154f957600080fd5b8235615504816154d1565b946020939093013593505050565b60006020828403121561552457600080fd5b8135611087816154d1565b600080600080600060a0868803121561554757600080fd5b8535615552816154d1565b94506020860135615562816154d1565b93506040860135615572816154d1565b92506060860135615582816154d1565b91506080860135615592816154d1565b809150509295509295909350565b6000806000606084860312156155b557600080fd5b83356155c0816154d1565b925060208401356155d0816154d1565b929592945050506040919091013590565b6000602082840312156155f357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715615633576156336155fa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615662576156626155fa565b604052919050565b600067ffffffffffffffff821115615684576156846155fa565b50601f01601f191660200190565b600080604083850312156156a557600080fd5b82356156b0816154d1565b9150602083013567ffffffffffffffff8111156156cc57600080fd5b8301601f810185136156dd57600080fd5b80356156f06156eb8261566a565b615639565b81815286602083850101111561570557600080fd5b816020840160208301376000602083830101528093505050509250929050565b61ffff8116811461153457600080fd5b60006020828403121561574757600080fd5b813561108781615725565b6000806040838503121561576557600080fd5b8235615770816154d1565b91506020830135615780816154d1565b809150509250929050565b63ffffffff8116811461153457600080fd5b6000602082840312156157af57600080fd5b81356110878161578b565b600181811c908216806157ce57607f821691505b602082108103614e9f57634e487b7160e01b600052602260045260246000fd5b60006020828403121561580057600080fd5b815167ffffffffffffffff81111561581757600080fd5b8201601f8101841361582857600080fd5b80516158366156eb8261566a565b81815285602083850101111561584b57600080fd5b61585c82602083016020860161547a565b95945050505050565b6702632b233b4ba3c960c51b81526000825161588881600885016020870161547a565b9190910160080192915050565b601360fa1b8152600082516158b181600185016020870161547a565b9190910160010192915050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf6158be565b634e487b7160e01b600052603260045260246000fd5b60008261591a57634e487b7160e01b600052601260045260246000fd5b500490565b6004811061593d57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160601b0385811682528416602082015260808101615966604083018561591f565b82606083015295945050505050565b81810381811115610ccf57610ccf6158be565b6001600160601b03851681526020810184905260808101615966604083018561591f565b6000600182016159be576159be6158be565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600290820152614c3960f01b604082015260600190565b600060208284031215615a8b57600080fd5b5051919050565b8481526020810184905260808101615966604083018561591f565b634e487b7160e01b600052603160045260246000fd5b600060208284031215615ad557600080fd5b8151611087816154d1565b600081615aef57615aef6158be565b506000190190565b634e487b7160e01b600052600160045260246000fd5b8082028115828204841417610ccf57610ccf6158be565b600060208284031215615b3657600080fd5b815161108781615725565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215615b9e57600080fd5b8151801515811461108757600080fd5b600060208284031215615bc057600080fd5b815160ff8116811461108757600080fd5b600181815b80851115615c0c578160001904821115615bf257615bf26158be565b80851615615bff57918102915b93841c9390800290615bd6565b509250929050565b600082615c2357506001610ccf565b81615c3057506000610ccf565b8160018114615c465760028114615c5057615c6c565b6001915050610ccf565b60ff841115615c6157615c616158be565b50506001821b610ccf565b5060208310610133831016604e8410600b8410161715615c8f575081810a610ccf565b615c998383615bd1565b8060001904821115615cad57615cad6158be565b029392505050565b60006110878383615c14565b8281526060810161108760208301848051825260209081015163ffffffff16910152565b600060408284031215615cf757600080fd5b615cff615610565b8251615d0a81615725565b8152602083015164ffffffffff81168114615d2457600080fd5b60208201529392505050565b600060408284031215615d4257600080fd5b615d4a615610565b825181526020830151615d248161578b565b8251815260208084015163ffffffff16908201526080810182516040830152602083015163ffffffff166060830152611087565b8151815260208083015163ffffffff169082015260408101610ccf565b64ffffffffff828116828216039080821115615dcb57615dcb6158be565b5092915050565b601f8211156118ee57600081815260208120601f850160051c81016020861015615df95750805b601f850160051c820191505b8181101561100457828155600101615e05565b815167ffffffffffffffff811115615e3257615e326155fa565b615e4681615e4084546157ba565b84615dd2565b602080601f831160018114615e7b5760008415615e635750858301515b600019600386901b1c1916600185901b178555611004565b600085815260208120601f198616915b82811015615eaa57888601518255948401946001909101908401615e8b565b5085821015615ec85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615eea81846020870161547a565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564d58e94604d90293a1c1ad95bfe6a6e6c352c33c5774a4b6b4f4b6f7460da29c5a2646970667358221220c4b56974d7bcc9a4b8cde298dda0e7d864971d84befea21a0bd2d57f41d36f4364736f6c63430008120033", "libraries": { "APRHistory": "0x0165878A594ca255338adfa4d48449f69242Eb8F" }, @@ -1959,15 +1959,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 6980, + "astId": 7768, "contract": "contracts/src/LToken.sol:LToken", "label": "_globalOwner", "offset": 0, "slot": "301", - "type": "t_contract(GlobalOwner)4271" + "type": "t_contract(GlobalOwner)4991" }, { - "astId": 7064, + "astId": 7852, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -1975,15 +1975,15 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 7082, + "astId": 7870, "contract": "contracts/src/LToken.sol:LToken", "label": "_globalPause", "offset": 0, "slot": "352", - "type": "t_contract(GlobalPause)4347" + "type": "t_contract(GlobalPause)5067" }, { - "astId": 7141, + "astId": 7929, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -1991,15 +1991,15 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 7155, + "astId": 7943, "contract": "contracts/src/LToken.sol:LToken", "label": "_globalBlacklist", "offset": 0, "slot": "403", - "type": "t_contract(GlobalBlacklist)4224" + "type": "t_contract(GlobalBlacklist)4944" }, { - "astId": 7229, + "astId": 8017, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -2007,7 +2007,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 8248, + "astId": 9036, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -2015,7 +2015,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 8339, + "astId": 9127, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -2031,7 +2031,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 8444, + "astId": 9232, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -2039,7 +2039,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 7281, + "astId": 8069, "contract": "contracts/src/LToken.sol:LToken", "label": "_invested", "offset": 0, @@ -2047,23 +2047,23 @@ "type": "t_contract(IERC20Upgradeable)1724" }, { - "astId": 7287, + "astId": 8075, "contract": "contracts/src/LToken.sol:LToken", "label": "accountsDetails", "offset": 0, "slot": "655", - "type": "t_mapping(t_address,t_struct(AccountDetails)7277_storage)" + "type": "t_mapping(t_address,t_struct(AccountDetails)8065_storage)" }, { - "astId": 7292, + "astId": 8080, "contract": "contracts/src/LToken.sol:LToken", "label": "_aprHistory", "offset": 0, "slot": "656", - "type": "t_array(t_struct(Pack)8476_storage)dyn_storage" + "type": "t_array(t_struct(Pack)9264_storage)dyn_storage" }, { - "astId": 7297, + "astId": 8085, "contract": "contracts/src/LToken.sol:LToken", "label": "rewardsRedirectsFromTo", "offset": 0, @@ -2071,7 +2071,7 @@ "type": "t_mapping(t_address,t_address)" }, { - "astId": 7302, + "astId": 8090, "contract": "contracts/src/LToken.sol:LToken", "label": "rewardsRedirectsToFrom", "offset": 0, @@ -2079,7 +2079,7 @@ "type": "t_mapping(t_address,t_array(t_address)dyn_storage)" }, { - "astId": 7305, + "astId": 8093, "contract": "contracts/src/LToken.sol:LToken", "label": "_isClaiming", "offset": 0, @@ -2087,7 +2087,7 @@ "type": "t_bool" }, { - "astId": 8155, + "astId": 8943, "contract": "contracts/src/LToken.sol:LToken", "label": "__gap", "offset": 0, @@ -2111,15 +2111,15 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 4415, + "astId": 5135, "contract": "contracts/src/LToken.sol:LToken", "label": "ldyStaking", "offset": 0, "slot": "761", - "type": "t_contract(LDYStaking)4089" + "type": "t_contract(LDYStaking)4745" }, { - "astId": 4418, + "astId": 5138, "contract": "contracts/src/LToken.sol:LToken", "label": "withdrawer", "offset": 0, @@ -2127,7 +2127,7 @@ "type": "t_address_payable" }, { - "astId": 4421, + "astId": 5141, "contract": "contracts/src/LToken.sol:LToken", "label": "fund", "offset": 0, @@ -2135,7 +2135,7 @@ "type": "t_address" }, { - "astId": 4424, + "astId": 5144, "contract": "contracts/src/LToken.sol:LToken", "label": "feesRateUD7x3", "offset": 20, @@ -2143,7 +2143,7 @@ "type": "t_uint32" }, { - "astId": 4427, + "astId": 5147, "contract": "contracts/src/LToken.sol:LToken", "label": "retentionRateUD7x3", "offset": 24, @@ -2151,7 +2151,7 @@ "type": "t_uint32" }, { - "astId": 4430, + "astId": 5150, "contract": "contracts/src/LToken.sol:LToken", "label": "unclaimedFees", "offset": 0, @@ -2159,7 +2159,7 @@ "type": "t_uint256" }, { - "astId": 4433, + "astId": 5153, "contract": "contracts/src/LToken.sol:LToken", "label": "totalQueued", "offset": 0, @@ -2167,7 +2167,7 @@ "type": "t_uint256" }, { - "astId": 4436, + "astId": 5156, "contract": "contracts/src/LToken.sol:LToken", "label": "usableUnderlyings", "offset": 0, @@ -2175,15 +2175,15 @@ "type": "t_uint256" }, { - "astId": 4441, + "astId": 5161, "contract": "contracts/src/LToken.sol:LToken", "label": "withdrawalQueue", "offset": 0, "slot": "767", - "type": "t_array(t_struct(WithdrawalRequest)4390_storage)dyn_storage" + "type": "t_array(t_struct(WithdrawalRequest)5110_storage)dyn_storage" }, { - "astId": 4444, + "astId": 5164, "contract": "contracts/src/LToken.sol:LToken", "label": "withdrawalQueueCursor", "offset": 0, @@ -2191,20 +2191,20 @@ "type": "t_uint256" }, { - "astId": 4449, + "astId": 5169, "contract": "contracts/src/LToken.sol:LToken", "label": "frozenRequests", "offset": 0, "slot": "769", - "type": "t_array(t_struct(WithdrawalRequest)4390_storage)dyn_storage" + "type": "t_array(t_struct(WithdrawalRequest)5110_storage)dyn_storage" }, { - "astId": 4454, + "astId": 5174, "contract": "contracts/src/LToken.sol:LToken", "label": "transfersListeners", "offset": 0, "slot": "770", - "type": "t_array(t_contract(ITransfersListener)8457)dyn_storage" + "type": "t_array(t_contract(ITransfersListener)9245)dyn_storage" } ], "types": { @@ -2224,20 +2224,20 @@ "label": "address[]", "numberOfBytes": "32" }, - "t_array(t_contract(ITransfersListener)8457)dyn_storage": { - "base": "t_contract(ITransfersListener)8457", + "t_array(t_contract(ITransfersListener)9245)dyn_storage": { + "base": "t_contract(ITransfersListener)9245", "encoding": "dynamic_array", "label": "contract ITransfersListener[]", "numberOfBytes": "32" }, - "t_array(t_struct(Pack)8476_storage)dyn_storage": { - "base": "t_struct(Pack)8476_storage", + "t_array(t_struct(Pack)9264_storage)dyn_storage": { + "base": "t_struct(Pack)9264_storage", "encoding": "dynamic_array", "label": "struct APRHistory.Pack[]", "numberOfBytes": "32" }, - "t_array(t_struct(WithdrawalRequest)4390_storage)dyn_storage": { - "base": "t_struct(WithdrawalRequest)4390_storage", + "t_array(t_struct(WithdrawalRequest)5110_storage)dyn_storage": { + "base": "t_struct(WithdrawalRequest)5110_storage", "encoding": "dynamic_array", "label": "struct LToken.WithdrawalRequest[]", "numberOfBytes": "32" @@ -2277,17 +2277,17 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(GlobalBlacklist)4224": { + "t_contract(GlobalBlacklist)4944": { "encoding": "inplace", "label": "contract GlobalBlacklist", "numberOfBytes": "20" }, - "t_contract(GlobalOwner)4271": { + "t_contract(GlobalOwner)4991": { "encoding": "inplace", "label": "contract GlobalOwner", "numberOfBytes": "20" }, - "t_contract(GlobalPause)4347": { + "t_contract(GlobalPause)5067": { "encoding": "inplace", "label": "contract GlobalPause", "numberOfBytes": "20" @@ -2297,12 +2297,12 @@ "label": "contract IERC20Upgradeable", "numberOfBytes": "20" }, - "t_contract(ITransfersListener)8457": { + "t_contract(ITransfersListener)9245": { "encoding": "inplace", "label": "contract ITransfersListener", "numberOfBytes": "20" }, - "t_contract(LDYStaking)4089": { + "t_contract(LDYStaking)4745": { "encoding": "inplace", "label": "contract LDYStaking", "numberOfBytes": "20" @@ -2328,12 +2328,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_uint256)" }, - "t_mapping(t_address,t_struct(AccountDetails)7277_storage)": { + "t_mapping(t_address,t_struct(AccountDetails)8065_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct InvestUpgradeable.AccountDetails)", "numberOfBytes": "32", - "value": "t_struct(AccountDetails)7277_storage" + "value": "t_struct(AccountDetails)8065_storage" }, "t_mapping(t_address,t_uint256)": { "encoding": "mapping", @@ -2347,20 +2347,20 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccountDetails)7277_storage": { + "t_struct(AccountDetails)8065_storage": { "encoding": "inplace", "label": "struct InvestUpgradeable.AccountDetails", "members": [ { - "astId": 7274, + "astId": 8062, "contract": "contracts/src/LToken.sol:LToken", "label": "period", "offset": 0, "slot": "0", - "type": "t_struct(InvestmentPeriod)7271_storage" + "type": "t_struct(InvestmentPeriod)8059_storage" }, { - "astId": 7276, + "astId": 8064, "contract": "contracts/src/LToken.sol:LToken", "label": "virtualBalance", "offset": 0, @@ -2370,12 +2370,12 @@ ], "numberOfBytes": "128" }, - "t_struct(InvestmentPeriod)7271_storage": { + "t_struct(InvestmentPeriod)8059_storage": { "encoding": "inplace", "label": "struct InvestUpgradeable.InvestmentPeriod", "members": [ { - "astId": 7267, + "astId": 8055, "contract": "contracts/src/LToken.sol:LToken", "label": "timestamp", "offset": 0, @@ -2383,22 +2383,22 @@ "type": "t_uint40" }, { - "astId": 7270, + "astId": 8058, "contract": "contracts/src/LToken.sol:LToken", "label": "ref", "offset": 0, "slot": "1", - "type": "t_struct(Reference)8481_storage" + "type": "t_struct(Reference)9269_storage" } ], "numberOfBytes": "96" }, - "t_struct(Pack)8476_storage": { + "t_struct(Pack)9264_storage": { "encoding": "inplace", "label": "struct APRHistory.Pack", "members": [ { - "astId": 8469, + "astId": 9257, "contract": "contracts/src/LToken.sol:LToken", "label": "aprsUD7x3", "offset": 0, @@ -2406,7 +2406,7 @@ "type": "t_array(t_uint16)4_storage" }, { - "astId": 8473, + "astId": 9261, "contract": "contracts/src/LToken.sol:LToken", "label": "timestamps", "offset": 0, @@ -2414,7 +2414,7 @@ "type": "t_array(t_uint40)4_storage" }, { - "astId": 8475, + "astId": 9263, "contract": "contracts/src/LToken.sol:LToken", "label": "cursor", "offset": 0, @@ -2424,12 +2424,12 @@ ], "numberOfBytes": "96" }, - "t_struct(Reference)8481_storage": { + "t_struct(Reference)9269_storage": { "encoding": "inplace", "label": "struct APRHistory.Reference", "members": [ { - "astId": 8478, + "astId": 9266, "contract": "contracts/src/LToken.sol:LToken", "label": "packIndex", "offset": 0, @@ -2437,7 +2437,7 @@ "type": "t_uint256" }, { - "astId": 8480, + "astId": 9268, "contract": "contracts/src/LToken.sol:LToken", "label": "cursorIndex", "offset": 0, @@ -2447,12 +2447,12 @@ ], "numberOfBytes": "64" }, - "t_struct(WithdrawalRequest)4390_storage": { + "t_struct(WithdrawalRequest)5110_storage": { "encoding": "inplace", "label": "struct LToken.WithdrawalRequest", "members": [ { - "astId": 4387, + "astId": 5107, "contract": "contracts/src/LToken.sol:LToken", "label": "account", "offset": 0, @@ -2460,7 +2460,7 @@ "type": "t_address" }, { - "astId": 4389, + "astId": 5109, "contract": "contracts/src/LToken.sol:LToken", "label": "amount", "offset": 20, diff --git a/contracts/hardhat/deployments/localhost/LUSDC_Proxy.json b/contracts/hardhat/deployments/localhost/LUSDC_Proxy.json index a2782b28..a4e8aa15 100644 --- a/contracts/hardhat/deployments/localhost/LUSDC_Proxy.json +++ b/contracts/hardhat/deployments/localhost/LUSDC_Proxy.json @@ -79,7 +79,7 @@ "transactionIndex": 0, "gasUsed": "652222", "logsBloom": "0x0000000000000000000000000000000040000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000400000000000000001000000000000000000000000000", - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132", + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4", "transactionHash": "0xec1c869bf0e186536e1800b5313b9282c47faf42885f2c0b8d4c9d6bdf7f67d8", "logs": [ { @@ -93,7 +93,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132" + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4" }, { "transactionIndex": 0, @@ -105,7 +105,7 @@ ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 1, - "blockHash": "0x1660a821e1683ddc6d2e7b0a50b2d95ddd88cbb25a73c438e46d222f70cb8132" + "blockHash": "0xb25f4724908d24a48899128716bbfa3f68920a7001ef4dd9e3dff2f1771819c4" } ], "blockNumber": 11, diff --git a/contracts/hardhat/deployments/localhost/USDC.json b/contracts/hardhat/deployments/localhost/USDC.json index 1d1ea992..362dd966 100644 --- a/contracts/hardhat/deployments/localhost/USDC.json +++ b/contracts/hardhat/deployments/localhost/USDC.json @@ -350,7 +350,7 @@ "type": "function" } ], - "transactionHash": "0x67a8f6365ed7214c3f2115434a6643b9d2b3b4cb1f9ee12831c84263c53e1155", + "transactionHash": "0x423f9fb4170ff70042564c2b0a2df0e60fab95db8cbc655c260ea5f76fdb8d8e", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -358,8 +358,8 @@ "transactionIndex": 0, "gasUsed": "762005", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x5e0e5013c22dc40265bc48ee502e58acdc5ab69528fc5e70e73e833661fc12ad", - "transactionHash": "0x67a8f6365ed7214c3f2115434a6643b9d2b3b4cb1f9ee12831c84263c53e1155", + "blockHash": "0xcee24bbba07426aa2a189dacb8007da9c90643d415905c2594dbe4bf2644fef8", + "transactionHash": "0x423f9fb4170ff70042564c2b0a2df0e60fab95db8cbc655c260ea5f76fdb8d8e", "logs": [], "blockNumber": 9, "cumulativeGasUsed": "762005", @@ -372,10 +372,10 @@ 6 ], "numDeployments": 1, - "solcInputHash": "1c94255f5edec71501da736e9b19ae5f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"name\":\"setDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"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(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"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`.\"},\"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.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setDecimals(uint8)\":{\"notice\":\"Used in tests to test different decimals scenarios.\"}},\"notice\":\"Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls. It represents: - a FIAT-based stablecoin when used to test the LToken contract, - the $LDY token when used to test the LDYStaking contract. This contract accept decimals as constructor argument, so it can be used to to easily test different decimals scenarios.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GenericERC20.sol\":\"GenericERC20\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n _spendAllowance(account, _msgSender(), amount);\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x0d19410453cda55960a818e02bd7c18952a5c8fe7a3036e81f0d599f34487a7b\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/GenericERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20} from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport {ERC20Burnable} from \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @notice Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls.\\n * It represents:\\n * - a FIAT-based stablecoin when used to test the LToken contract,\\n * - the $LDY token when used to test the LDYStaking contract.\\n * This contract accept decimals as constructor argument, so it can be used to to\\n * easily test different decimals scenarios.\\n */\\ncontract GenericERC20 is ERC20, ERC20Burnable {\\n uint8 private _decimals;\\n\\n constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) {\\n _decimals = decimals_;\\n }\\n\\n function mint(uint256 amount) public {\\n _mint(msg.sender, amount);\\n }\\n\\n function decimals() public view virtual override returns (uint8) {\\n return _decimals;\\n }\\n\\n /**\\n * Used in tests to test different decimals scenarios.\\n */\\n function setDecimals(uint8 decimals_) public {\\n _decimals = decimals_;\\n }\\n}\\n\",\"keccak256\":\"0x6c041437008dd8d1dece8f784e02ad8c17a403dbde82f7dcb54abb39cd7b363a\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162000e8238038062000e82833981016040819052620000349162000139565b828260036200004483826200024d565b5060046200005382826200024d565b50506005805460ff191660ff93909316929092179091555062000319915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200009c57600080fd5b81516001600160401b0380821115620000b957620000b962000074565b604051601f8301601f19908116603f01168101908282118183101715620000e457620000e462000074565b816040528381526020925086838588010111156200010157600080fd5b600091505b8382101562000125578582018301518183018401529082019062000106565b600093810190920192909252949350505050565b6000806000606084860312156200014f57600080fd5b83516001600160401b03808211156200016757600080fd5b62000175878388016200008a565b945060208601519150808211156200018c57600080fd5b506200019b868287016200008a565b925050604084015160ff81168114620001b357600080fd5b809150509250925092565b600181811c90821680620001d357607f821691505b602082108103620001f457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024857600081815260208120601f850160051c81016020861015620002235750805b601f850160051c820191505b8181101562000244578281556001016200022f565b5050505b505050565b81516001600160401b0381111562000269576200026962000074565b62000281816200027a8454620001be565b84620001fa565b602080601f831160018114620002b95760008415620002a05750858301515b600019600386901b1c1916600185901b17855562000244565b600085815260208120601f198616915b82811015620002ea57888601518255948401946001909101908401620002c9565b5085821015620003095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610b5980620003296000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a0712d6811610066578063a0712d6814610205578063a457c2d714610218578063a9059cbb1461022b578063dd62ed3e1461023e57600080fd5b806370a082311461019d57806379cc6790146101c65780637a1395aa146101d957806395d89b41146101fd57600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce56714610160578063395093511461017557806342966c681461018857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610251565b60405161010f9190610967565b60405180910390f35b61012b6101263660046109d1565b6102e3565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b3660046109fb565b6102fd565b60055460405160ff909116815260200161010f565b61012b6101833660046109d1565b610321565b61019b610196366004610a37565b610343565b005b61013f6101ab366004610a50565b6001600160a01b031660009081526020819052604090205490565b61019b6101d43660046109d1565b610350565b61019b6101e7366004610a72565b6005805460ff191660ff92909216919091179055565b610102610369565b61019b610213366004610a37565b610378565b61012b6102263660046109d1565b610382565b61012b6102393660046109d1565b610402565b61013f61024c366004610a95565b610410565b60606003805461026090610ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461028c90610ac8565b80156102d95780601f106102ae576101008083540402835291602001916102d9565b820191906000526020600020905b8154815290600101906020018083116102bc57829003601f168201915b5050505050905090565b6000336102f181858561043b565b60019150505b92915050565b60003361030b858285610560565b6103168585856105da565b506001949350505050565b6000336102f18185856103348383610410565b61033e9190610b02565b61043b565b61034d338261077e565b50565b61035b823383610560565b610365828261077e565b5050565b60606004805461026090610ac8565b61034d33826108a8565b600033816103908286610410565b9050838110156103f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610316828686840361043b565b6000336102f18185856105da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661049d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103ec565b6001600160a01b0382166104fe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103ec565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061056c8484610410565b905060001981146105d457818110156105c75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103ec565b6105d4848484840361043b565b50505050565b6001600160a01b03831661063e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103ec565b6001600160a01b0382166106a05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103ec565b6001600160a01b038316600090815260208190526040902054818110156107185760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103ec565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105d4565b6001600160a01b0382166107de5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103ec565b6001600160a01b038216600090815260208190526040902054818110156108525760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103ec565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610553565b6001600160a01b0382166108fe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103ec565b80600260008282546109109190610b02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b8181101561099457858101830151858201604001528201610978565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109cc57600080fd5b919050565b600080604083850312156109e457600080fd5b6109ed836109b5565b946020939093013593505050565b600080600060608486031215610a1057600080fd5b610a19846109b5565b9250610a27602085016109b5565b9150604084013590509250925092565b600060208284031215610a4957600080fd5b5035919050565b600060208284031215610a6257600080fd5b610a6b826109b5565b9392505050565b600060208284031215610a8457600080fd5b813560ff81168114610a6b57600080fd5b60008060408385031215610aa857600080fd5b610ab1836109b5565b9150610abf602084016109b5565b90509250929050565b600181811c90821680610adc57607f821691505b602082108103610afc57634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102f757634e487b7160e01b600052601160045260246000fdfea2646970667358221220d2f4cd5b3214b4afcf457f0b23ef33b5ccce80a994abef63a11a1eb414ef810464736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a0712d6811610066578063a0712d6814610205578063a457c2d714610218578063a9059cbb1461022b578063dd62ed3e1461023e57600080fd5b806370a082311461019d57806379cc6790146101c65780637a1395aa146101d957806395d89b41146101fd57600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce56714610160578063395093511461017557806342966c681461018857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610251565b60405161010f9190610967565b60405180910390f35b61012b6101263660046109d1565b6102e3565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b3660046109fb565b6102fd565b60055460405160ff909116815260200161010f565b61012b6101833660046109d1565b610321565b61019b610196366004610a37565b610343565b005b61013f6101ab366004610a50565b6001600160a01b031660009081526020819052604090205490565b61019b6101d43660046109d1565b610350565b61019b6101e7366004610a72565b6005805460ff191660ff92909216919091179055565b610102610369565b61019b610213366004610a37565b610378565b61012b6102263660046109d1565b610382565b61012b6102393660046109d1565b610402565b61013f61024c366004610a95565b610410565b60606003805461026090610ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461028c90610ac8565b80156102d95780601f106102ae576101008083540402835291602001916102d9565b820191906000526020600020905b8154815290600101906020018083116102bc57829003601f168201915b5050505050905090565b6000336102f181858561043b565b60019150505b92915050565b60003361030b858285610560565b6103168585856105da565b506001949350505050565b6000336102f18185856103348383610410565b61033e9190610b02565b61043b565b61034d338261077e565b50565b61035b823383610560565b610365828261077e565b5050565b60606004805461026090610ac8565b61034d33826108a8565b600033816103908286610410565b9050838110156103f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610316828686840361043b565b6000336102f18185856105da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661049d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103ec565b6001600160a01b0382166104fe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103ec565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061056c8484610410565b905060001981146105d457818110156105c75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103ec565b6105d4848484840361043b565b50505050565b6001600160a01b03831661063e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103ec565b6001600160a01b0382166106a05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103ec565b6001600160a01b038316600090815260208190526040902054818110156107185760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103ec565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105d4565b6001600160a01b0382166107de5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103ec565b6001600160a01b038216600090815260208190526040902054818110156108525760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103ec565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610553565b6001600160a01b0382166108fe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103ec565b80600260008282546109109190610b02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b8181101561099457858101830151858201604001528201610978565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109cc57600080fd5b919050565b600080604083850312156109e457600080fd5b6109ed836109b5565b946020939093013593505050565b600080600060608486031215610a1057600080fd5b610a19846109b5565b9250610a27602085016109b5565b9150604084013590509250925092565b600060208284031215610a4957600080fd5b5035919050565b600060208284031215610a6257600080fd5b610a6b826109b5565b9392505050565b600060208284031215610a8457600080fd5b813560ff81168114610a6b57600080fd5b60008060408385031215610aa857600080fd5b610ab1836109b5565b9150610abf602084016109b5565b90509250929050565b600181811c90821680610adc57607f821691505b602082108103610afc57634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102f757634e487b7160e01b600052601160045260246000fdfea2646970667358221220d2f4cd5b3214b4afcf457f0b23ef33b5ccce80a994abef63a11a1eb414ef810464736f6c63430008120033", + "solcInputHash": "616c2bbfbbb38e0f66e1812240dc44b0", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"name\":\"setDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"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\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"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(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"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`.\"},\"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.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setDecimals(uint8)\":{\"notice\":\"Used in tests to test different decimals scenarios.\"}},\"notice\":\"Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls. It represents: - a FIAT-based stablecoin when used to test the LToken contract, - the $LDY token when used to test the LDYStaking contract. This contract accept decimals as constructor argument, so it can be used to to easily test different decimals scenarios.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/GenericERC20.sol\":\"GenericERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@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\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n /**\\n * @dev Destroys `amount` tokens from the caller.\\n *\\n * See {ERC20-_burn}.\\n */\\n function burn(uint256 amount) public virtual {\\n _burn(_msgSender(), amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n * allowance.\\n *\\n * See {ERC20-_burn} and {ERC20-allowance}.\\n *\\n * Requirements:\\n *\\n * - the caller must have allowance for ``accounts``'s tokens of at least\\n * `amount`.\\n */\\n function burnFrom(address account, uint256 amount) public virtual {\\n _spendAllowance(account, _msgSender(), amount);\\n _burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x0d19410453cda55960a818e02bd7c18952a5c8fe7a3036e81f0d599f34487a7b\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/src/GenericERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.18;\\n\\nimport {ERC20} from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport {ERC20Burnable} from \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n/**\\n * @notice Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls.\\n * It represents:\\n * - a FIAT-based stablecoin when used to test the LToken contract,\\n * - the $LDY token when used to test the LDYStaking contract.\\n * This contract accept decimals as constructor argument, so it can be used to to\\n * easily test different decimals scenarios.\\n */\\ncontract GenericERC20 is ERC20, ERC20Burnable {\\n uint8 private _decimals;\\n\\n constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) {\\n _decimals = decimals_;\\n }\\n\\n function mint(uint256 amount) public {\\n _mint(msg.sender, amount);\\n }\\n\\n function decimals() public view virtual override returns (uint8) {\\n return _decimals;\\n }\\n\\n /**\\n * Used in tests to test different decimals scenarios.\\n */\\n function setDecimals(uint8 decimals_) public {\\n _decimals = decimals_;\\n }\\n}\\n\",\"keccak256\":\"0x6c041437008dd8d1dece8f784e02ad8c17a403dbde82f7dcb54abb39cd7b363a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162000e8238038062000e82833981016040819052620000349162000139565b828260036200004483826200024d565b5060046200005382826200024d565b50506005805460ff191660ff93909316929092179091555062000319915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200009c57600080fd5b81516001600160401b0380821115620000b957620000b962000074565b604051601f8301601f19908116603f01168101908282118183101715620000e457620000e462000074565b816040528381526020925086838588010111156200010157600080fd5b600091505b8382101562000125578582018301518183018401529082019062000106565b600093810190920192909252949350505050565b6000806000606084860312156200014f57600080fd5b83516001600160401b03808211156200016757600080fd5b62000175878388016200008a565b945060208601519150808211156200018c57600080fd5b506200019b868287016200008a565b925050604084015160ff81168114620001b357600080fd5b809150509250925092565b600181811c90821680620001d357607f821691505b602082108103620001f457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024857600081815260208120601f850160051c81016020861015620002235750805b601f850160051c820191505b8181101562000244578281556001016200022f565b5050505b505050565b81516001600160401b0381111562000269576200026962000074565b62000281816200027a8454620001be565b84620001fa565b602080601f831160018114620002b95760008415620002a05750858301515b600019600386901b1c1916600185901b17855562000244565b600085815260208120601f198616915b82811015620002ea57888601518255948401946001909101908401620002c9565b5085821015620003095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610b5980620003296000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a0712d6811610066578063a0712d6814610205578063a457c2d714610218578063a9059cbb1461022b578063dd62ed3e1461023e57600080fd5b806370a082311461019d57806379cc6790146101c65780637a1395aa146101d957806395d89b41146101fd57600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce56714610160578063395093511461017557806342966c681461018857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610251565b60405161010f9190610967565b60405180910390f35b61012b6101263660046109d1565b6102e3565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b3660046109fb565b6102fd565b60055460405160ff909116815260200161010f565b61012b6101833660046109d1565b610321565b61019b610196366004610a37565b610343565b005b61013f6101ab366004610a50565b6001600160a01b031660009081526020819052604090205490565b61019b6101d43660046109d1565b610350565b61019b6101e7366004610a72565b6005805460ff191660ff92909216919091179055565b610102610369565b61019b610213366004610a37565b610378565b61012b6102263660046109d1565b610382565b61012b6102393660046109d1565b610402565b61013f61024c366004610a95565b610410565b60606003805461026090610ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461028c90610ac8565b80156102d95780601f106102ae576101008083540402835291602001916102d9565b820191906000526020600020905b8154815290600101906020018083116102bc57829003601f168201915b5050505050905090565b6000336102f181858561043b565b60019150505b92915050565b60003361030b858285610560565b6103168585856105da565b506001949350505050565b6000336102f18185856103348383610410565b61033e9190610b02565b61043b565b61034d338261077e565b50565b61035b823383610560565b610365828261077e565b5050565b60606004805461026090610ac8565b61034d33826108a8565b600033816103908286610410565b9050838110156103f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610316828686840361043b565b6000336102f18185856105da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661049d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103ec565b6001600160a01b0382166104fe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103ec565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061056c8484610410565b905060001981146105d457818110156105c75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103ec565b6105d4848484840361043b565b50505050565b6001600160a01b03831661063e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103ec565b6001600160a01b0382166106a05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103ec565b6001600160a01b038316600090815260208190526040902054818110156107185760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103ec565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105d4565b6001600160a01b0382166107de5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103ec565b6001600160a01b038216600090815260208190526040902054818110156108525760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103ec565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610553565b6001600160a01b0382166108fe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103ec565b80600260008282546109109190610b02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b8181101561099457858101830151858201604001528201610978565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109cc57600080fd5b919050565b600080604083850312156109e457600080fd5b6109ed836109b5565b946020939093013593505050565b600080600060608486031215610a1057600080fd5b610a19846109b5565b9250610a27602085016109b5565b9150604084013590509250925092565b600060208284031215610a4957600080fd5b5035919050565b600060208284031215610a6257600080fd5b610a6b826109b5565b9392505050565b600060208284031215610a8457600080fd5b813560ff81168114610a6b57600080fd5b60008060408385031215610aa857600080fd5b610ab1836109b5565b9150610abf602084016109b5565b90509250929050565b600181811c90821680610adc57607f821691505b602082108103610afc57634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102f757634e487b7160e01b600052601160045260246000fdfea2646970667358221220b32ece6e1db3686013560e72a925caea31a3ac745bf72344f66afa8fff3ef84064736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a0712d6811610066578063a0712d6814610205578063a457c2d714610218578063a9059cbb1461022b578063dd62ed3e1461023e57600080fd5b806370a082311461019d57806379cc6790146101c65780637a1395aa146101d957806395d89b41146101fd57600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce56714610160578063395093511461017557806342966c681461018857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610251565b60405161010f9190610967565b60405180910390f35b61012b6101263660046109d1565b6102e3565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b3660046109fb565b6102fd565b60055460405160ff909116815260200161010f565b61012b6101833660046109d1565b610321565b61019b610196366004610a37565b610343565b005b61013f6101ab366004610a50565b6001600160a01b031660009081526020819052604090205490565b61019b6101d43660046109d1565b610350565b61019b6101e7366004610a72565b6005805460ff191660ff92909216919091179055565b610102610369565b61019b610213366004610a37565b610378565b61012b6102263660046109d1565b610382565b61012b6102393660046109d1565b610402565b61013f61024c366004610a95565b610410565b60606003805461026090610ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461028c90610ac8565b80156102d95780601f106102ae576101008083540402835291602001916102d9565b820191906000526020600020905b8154815290600101906020018083116102bc57829003601f168201915b5050505050905090565b6000336102f181858561043b565b60019150505b92915050565b60003361030b858285610560565b6103168585856105da565b506001949350505050565b6000336102f18185856103348383610410565b61033e9190610b02565b61043b565b61034d338261077e565b50565b61035b823383610560565b610365828261077e565b5050565b60606004805461026090610ac8565b61034d33826108a8565b600033816103908286610410565b9050838110156103f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610316828686840361043b565b6000336102f18185856105da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661049d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103ec565b6001600160a01b0382166104fe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103ec565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061056c8484610410565b905060001981146105d457818110156105c75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103ec565b6105d4848484840361043b565b50505050565b6001600160a01b03831661063e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103ec565b6001600160a01b0382166106a05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103ec565b6001600160a01b038316600090815260208190526040902054818110156107185760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103ec565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105d4565b6001600160a01b0382166107de5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103ec565b6001600160a01b038216600090815260208190526040902054818110156108525760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103ec565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610553565b6001600160a01b0382166108fe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103ec565b80600260008282546109109190610b02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b8181101561099457858101830151858201604001528201610978565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109cc57600080fd5b919050565b600080604083850312156109e457600080fd5b6109ed836109b5565b946020939093013593505050565b600080600060608486031215610a1057600080fd5b610a19846109b5565b9250610a27602085016109b5565b9150604084013590509250925092565b600060208284031215610a4957600080fd5b5035919050565b600060208284031215610a6257600080fd5b610a6b826109b5565b9392505050565b600060208284031215610a8457600080fd5b813560ff81168114610a6b57600080fd5b60008060408385031215610aa857600080fd5b610ab1836109b5565b9150610abf602084016109b5565b90509250929050565b600181811c90821680610adc57607f821691505b602082108103610afc57634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102f757634e487b7160e01b600052601160045260246000fdfea2646970667358221220b32ece6e1db3686013560e72a925caea31a3ac745bf72344f66afa8fff3ef84064736f6c63430008120033", "devdoc": { "events": { "Approval(address,address,uint256)": { diff --git a/contracts/hardhat/deployments/localhost/solcInputs/3d20376140786af30d287ee442e9b474.json b/contracts/hardhat/deployments/localhost/solcInputs/3d20376140786af30d287ee442e9b474.json deleted file mode 100644 index 0aace587..00000000 --- a/contracts/hardhat/deployments/localhost/solcInputs/3d20376140786af30d287ee442e9b474.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@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" - }, - "@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" - }, - "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822ProxiableUpgradeable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n" - }, - "@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeaconUpgradeable {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" - }, - "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport \"../utils/Initializable.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n function __ERC1967Upgrade_init() internal onlyInitializing {\n }\n\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n }\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n AddressUpgradeable.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n }\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" - }, - "@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" - }, - "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n function __UUPSUpgradeable_init() internal onlyInitializing {\n }\n\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n }\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n *\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function upgradeTo(address newImplementation) public virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n *\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" - }, - "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.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 \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\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 function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\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 /**\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[45] private __gap;\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20Upgradeable.sol\";\nimport \"../../../security/PausableUpgradeable.sol\";\nimport \"../../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev ERC20 token with pausable token transfers, minting and burning.\n *\n * Useful for scenarios such as preventing trades until the end of an evaluation\n * period, or having an emergency switch for freezing all token transfers in the\n * event of a large bug.\n *\n * IMPORTANT: This contract does not include public pause and unpause functions. In\n * addition to inheriting this contract, you must define both functions, invoking the\n * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate\n * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will\n * make the contract unpausable.\n */\nabstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {\n function __ERC20Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __ERC20Pausable_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev See {ERC20-_beforeTokenTransfer}.\n *\n * Requirements:\n *\n * - the contract must not be paused.\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._beforeTokenTransfer(from, to, amount);\n\n require(!paused(), \"ERC20Pausable: token transfer while paused\");\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Wrapper.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20Upgradeable.sol\";\nimport \"../utils/SafeERC20Upgradeable.sol\";\nimport \"../../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Extension of the ERC20 token contract to support token wrapping.\n *\n * Users can deposit and withdraw \"underlying tokens\" and receive a matching number of \"wrapped tokens\". This is useful\n * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the\n * wrapping of an existing \"basic\" ERC20 into a governance token.\n *\n * _Available since v4.2._\n *\n * @custom:storage-size 51\n */\nabstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {\n IERC20Upgradeable private _underlying;\n\n function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing {\n __ERC20Wrapper_init_unchained(underlyingToken);\n }\n\n function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing {\n require(underlyingToken != this, \"ERC20Wrapper: cannot self wrap\");\n _underlying = underlyingToken;\n }\n\n /**\n * @dev See {ERC20-decimals}.\n */\n function decimals() public view virtual override returns (uint8) {\n try IERC20MetadataUpgradeable(address(_underlying)).decimals() returns (uint8 value) {\n return value;\n } catch {\n return super.decimals();\n }\n }\n\n /**\n * @dev Returns the address of the underlying ERC-20 token that is being wrapped.\n */\n function underlying() public view returns (IERC20Upgradeable) {\n return _underlying;\n }\n\n /**\n * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.\n */\n function depositFor(address account, uint256 amount) public virtual returns (bool) {\n address sender = _msgSender();\n require(sender != address(this), \"ERC20Wrapper: wrapper can't deposit\");\n SafeERC20Upgradeable.safeTransferFrom(_underlying, sender, address(this), amount);\n _mint(account, amount);\n return true;\n }\n\n /**\n * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.\n */\n function withdrawTo(address account, uint256 amount) public virtual returns (bool) {\n _burn(_msgSender(), amount);\n SafeERC20Upgradeable.safeTransfer(_underlying, account, amount);\n return true;\n }\n\n /**\n * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal\n * function that can be exposed with access control if desired.\n */\n function _recover(address account) internal virtual returns (uint256) {\n uint256 value = _underlying.balanceOf(address(this)) - totalSupply();\n _mint(account, value);\n return value;\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.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 \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.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 IERC20PermitUpgradeable {\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.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 IERC20Upgradeable {\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" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../extensions/IERC20PermitUpgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n * 0 before setting it to a non-zero value.\n */\n function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20PermitUpgradeable token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token));\n }\n}\n" - }, - "@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" - }, - "@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" - }, - "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.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 StorageSlotUpgradeable {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n 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" - }, - "@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" - }, - "@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" - }, - "@openzeppelin/contracts/security/Pausable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n constructor() {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" - }, - "@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" - }, - "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n _spendAllowance(account, _msgSender(), amount);\n _burn(account, amount);\n }\n}\n" - }, - "@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" - }, - "@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" - }, - "@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" - }, - "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to\n * 0 before setting it to a non-zero value.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Address.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 Address {\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" - }, - "@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" - }, - "contracts/src/abstracts/base/BaseUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"../GlobalPausableUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"../GlobalOwnableUpgradeable.sol\";\nimport {GlobalRestrictableUpgradeable} from \"../GlobalRestrictableUpgradeable.sol\";\nimport {RecoverableUpgradeable} from \"../RecoverableUpgradeable.sol\";\n\n/**\n * @title BaseUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This abstract contract acts as a base for numerous contracts in this codebase,\n * minimizing code repetition and enhancing readability and maintainability.\n *\n * @dev For further details, see \"Base\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract BaseUpgradeable is\n Initializable,\n UUPSUpgradeable,\n GlobalOwnableUpgradeable,\n GlobalPausableUpgradeable,\n GlobalRestrictableUpgradeable,\n RecoverableUpgradeable\n{\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n */\n function __Base_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_\n ) internal onlyInitializing {\n __UUPSUpgradeable_init();\n __GlobalOwnable_init(globalOwner_);\n __Pausable_init();\n __GlobalPausable_init_unchained(globalPause_);\n __GlobalRestrictable_init_unchained(globalBlacklist_);\n __Recoverable_init_unchained();\n }\n\n function __Base_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/base/ERC20BaseUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {ERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\nimport {ERC20PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"./BaseUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"../GlobalPausableUpgradeable.sol\";\n\n/**\n * @title ERC20BaseUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This abstract contract is an extension of BaseUpgradeable intended to be used\n * as a base for ERC20 tokens contracts.\n *\n * @dev For further details, see \"ERC20BaseUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract ERC20BaseUpgradeable is\n ERC20Upgradeable,\n BaseUpgradeable,\n ERC20PausableUpgradeable\n{\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param name_ The display name of the token.\n * @param symbol_ The symbol of the token.\n */\n function __ERC20Base_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n string memory name_,\n string memory symbol_\n ) internal onlyInitializing {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n __ERC20_init(name_, symbol_);\n __ERC20Pausable_init_unchained();\n }\n\n function __ERC20Base_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and PausableUpgradeable parent contracts.\n * The GlobalPausableUpgradeable version is preferred because it checks the pause\n * state from the GlobalPause contract.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, PausableUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @dev Required override of _beforeTokenTransfer() which is implemented by both\n * ERC20PausableUpgradeable and ERC20Upgradeable parent contracts.\n * The ERC20PausableUpgradeable version is preferred because it also checks that\n * the contract is not paused before allowing the transfer.\n * @inheritdoc ERC20PausableUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n )\n internal\n virtual\n override(ERC20PausableUpgradeable, ERC20Upgradeable)\n whenNotPaused\n notBlacklisted(from)\n notBlacklisted(to)\n {\n ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/GlobalOwnableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {OwnableUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {GlobalOwner} from \"../GlobalOwner.sol\";\n\n/**\n * @title GlobalOwnableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit ownership from the specified GlobalOwner\n * contract (see GlobalOwner.sol). This design facilitates centralized management\n * of ownership for all the Ledgity Yield contracts.\n *\n * @dev Security measure:\n * The _globalOwner state must be set at initialization time and, for evident security\n * reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalOwnableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalOwnableUpgradeable is Initializable, OwnableUpgradeable {\n /**\n * @notice The GlobalOwner contract the ownership will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalOwner private _globalOwner;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function __GlobalOwnable_init(address globalOwner_) internal onlyInitializing {\n __GlobalOwnable_init_unchained(globalOwner_);\n // Note: __Ownable_init() doesn't have to be called as the overriden owner()\n // function no longer rely on the _owner state. Since __Ownable_init() only sets\n // the initial _owner value, calling it would have no effect.\n }\n\n function __GlobalOwnable_init_unchained(address globalOwner_) internal onlyInitializing {\n _globalOwner = GlobalOwner(globalOwner_);\n }\n\n /**\n * @notice Retrieves the address of GlobalOwner contract.\n * @return The address of the GlobalOwner contract.\n */\n function globalOwner() public view returns (address) {\n return address(_globalOwner);\n }\n\n /**\n * @notice Override of OwnableUpgradeable.owner() that retrieves the owner's address\n * from the GlobalOwner contract instead.\n * @return The address of the owner\n */\n function owner() public view override returns (address) {\n return _globalOwner.owner();\n }\n\n /**\n * @notice Override of OwnableUpgradeable.transferOwnership() that always reverts.\n * Ownership is managed by the GlobalOwner contract and must be modified there.\n */\n function transferOwnership(address newOwner) public view override onlyOwner {\n newOwner; // Silence unused variable compiler warning\n revert(\"L8\");\n }\n\n /**\n * @notice Override of OwnableUpgradeable.renounceOwnership() that always reverts.\n * Ownership is managed by the GlobalOwner contract and must be modified there.\n */\n function renounceOwnership() public view override onlyOwner {\n revert(\"L65\");\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/GlobalPausableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {GlobalPause} from \"../GlobalPause.sol\";\n\n/**\n * @title GlobalPausableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit a pause state from the specified GlobalPause\n * contract (see GlobalPause.sol). This design facilitates centralized management of\n * pause state for all the Ledgity Yield contracts.\n *\n * @dev Security measure\n * The _globalPause state must be set at initialization time and, for evident security\n * reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalPausableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalPausableUpgradeable is Initializable, PausableUpgradeable {\n /**\n * @notice The GlobalPause contract the pause state will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalPause private _globalPause;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalPause_ The address of the GlobalPause contract.\n */\n function __GlobalPausable_init(address globalPause_) internal onlyInitializing {\n __Pausable_init();\n __GlobalPausable_init_unchained(globalPause_);\n }\n\n function __GlobalPausable_init_unchained(address globalPause_) internal onlyInitializing {\n _globalPause = GlobalPause(globalPause_);\n }\n\n /**\n * @notice Retrieves the address of GlobalPause contract.\n * @return The address of the GlobalPause contract.\n */\n function globalPause() public view returns (address) {\n return address(_globalPause);\n }\n\n /**\n * @notice Override of PausableUpgradeable.pause() that retrieves the pause state\n * from the GlobalPause contract instead.\n * @return Whether the contract is paused or not.\n */\n function paused() public view virtual override returns (bool) {\n return _globalPause.paused();\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/GlobalRestrictableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalBlacklist} from \"../GlobalBlacklist.sol\";\n\n/**\n * @title GlobalRestrictableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts will inherit a blacklist state from the specified\n * GlobalBlacklist contract (see GlobalBlacklist.sol). This design facilitates\n * centralized management of a blacklist for all the Ledgity Yield contracts.\n *\n * @dev Security measure:\n * The _globalBlacklist state must be set at initialization time and, for evident\n * security reasons, cannot be changed afterward.\n *\n * @dev For further details, see \"GlobalRestrictableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract GlobalRestrictableUpgradeable is Initializable {\n /**\n * @notice The GlobalBlacklist contract the blacklist state will be inherited from.\n * @dev This state is private so derived contracts cannot change its value.\n */\n GlobalBlacklist private _globalBlacklist;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n */\n function __GlobalRestrictable_init(address globalBlacklist_) internal onlyInitializing {\n __GlobalRestrictable_init_unchained(globalBlacklist_);\n }\n\n function __GlobalRestrictable_init_unchained(\n address globalBlacklist_\n ) internal onlyInitializing {\n _globalBlacklist = GlobalBlacklist(globalBlacklist_);\n }\n\n /**\n * @notice Retrieves the address of GlobalBlacklist contract.\n * @return The address of the GlobalBlacklist contract.\n */\n function globalBlacklist() public view returns (address) {\n return address(_globalBlacklist);\n }\n\n /**\n * @notice Reverts if the given account is blacklisted by the GlobalBlacklist contract.\n * @param account Address to verify.\n */\n modifier notBlacklisted(address account) {\n require(isBlacklisted(account) == false, \"L9\");\n _;\n }\n\n /**\n * @notice Checks if the given account is blacklisted by the GlobalBlacklist contract.\n * @param account Address to verify.\n * @return Whether the account is blacklisted.\n */\n function isBlacklisted(address account) internal view returns (bool) {\n return _globalBlacklist.isBlacklisted(account);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/InvestUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n// Contracts\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./GlobalOwnableUpgradeable.sol\";\nimport {GlobalPausableUpgradeable} from \"./GlobalPausableUpgradeable.sol\";\nimport {GlobalRestrictableUpgradeable} from \"./GlobalRestrictableUpgradeable.sol\";\nimport \"./base/BaseUpgradeable.sol\";\nimport {RecoverableUpgradeable} from \"../abstracts/RecoverableUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {APRHistory as APRH} from \"../libs/APRHistory.sol\";\nimport {SUD} from \"../libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\n\n/**\n * @title InvestUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts are provided with utilities to manage an invested token,\n * users' investment periods, rewards calculations, virtual balances, and auto-compounding.\n *\n * @dev Intuition:\n * This contract primarily exists for code splitting and reusability. It unburdens the\n * LToken contract code, making it easier to understand and maintain.\n *\n * This contract is generic because it may be used in the LDYStaking contract in the future.\n *\n * @dev Definitions:\n * - Investment: The act of depositing or investing tokens into the contract.\n * - Investment period: Time between the last invested amount change and the present.\n * - Virtual balance: Temporary storage for account rewards, used when those can't be\n * distributed between investment periods.\n * - Rewards redirection: Mechanism allowing an account to redirect its rewards to another.\n *\n * @dev Derived contract must:\n * - Set invested token during initialization\n * - Implement _investmentOf() function\n * - (optionally) Implement _distributeRewards() function\n *\n * @dev For further details, see \"InvestmentUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract InvestUpgradeable is BaseUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n using APRH for APRH.Pack[];\n\n /**\n * @notice Represents an account's investment period.\n * @param timestamp The timestamp of the most recent rewards distribution.\n * @param ref The reference of the last APR checkpoint at that timestamp.\n */\n struct InvestmentPeriod {\n uint40 timestamp; // Supports dates up to 20/02/36812\n APRH.Reference ref;\n }\n\n /**\n * @notice Represents the investment details of an account.\n * @param period The current investment period of the account.\n * @param virtualBalance May hold a part of account rewards until they are claimed.\n */\n struct AccountDetails {\n InvestmentPeriod period;\n uint256 virtualBalance;\n }\n\n /// @notice Holds a reference to the invested token's contract.\n IERC20Upgradeable private _invested;\n\n /// @notice Holds investment details of each account.\n mapping(address => AccountDetails) internal accountsDetails;\n\n /// @notice Holds an history of the APR value over time (see APRHistory.sol).\n APRH.Pack[] private _aprHistory;\n\n /// @notice Holds active rewards redirections in both from->to and to->from[] ways.\n mapping(address => address) public rewardsRedirectsFromTo;\n mapping(address => address[]) public rewardsRedirectsToFrom;\n\n /// @notice Is used to prevent infinite loop in _beforeInvestmentChange().\n bool private _isClaiming;\n\n /**\n * @notice Emitted to inform listeners about a change in the APR's value.\n * @param newAPRUD7x3 The new APR in UD7x3 format.\n */\n event APRChangeEvent(uint16 newAPRUD7x3);\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param invested_ The address of the invested token contract.\n */\n function __Invest_init(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address invested_\n ) internal onlyInitializing {\n __Base_init(globalOwner_, globalPause_, globalBlacklist_);\n __Invest_init_unchained(invested_);\n }\n\n function __Invest_init_unchained(address invested_) internal onlyInitializing {\n // Set invested token\n _invested = IERC20Upgradeable(invested_);\n\n // Define initial APR to 0%. This would prevent getAPR() from reverting because\n // of an empty APR history\n _aprHistory.setAPR(0);\n }\n\n /**\n * @notice Retrieves the reference to the invested token contract.\n * @return The reference to the invested token contract.\n */\n function invested() public view returns (IERC20Upgradeable) {\n return _invested;\n }\n\n /**\n * @notice Updates the investment APR. Restricted to owner.\n * @param aprUD7x3 The new APR in UD7x3 format.\n */\n function setAPR(uint16 aprUD7x3) public onlyOwner {\n _aprHistory.setAPR(aprUD7x3);\n emit APRChangeEvent(aprUD7x3);\n }\n\n /**\n * @notice Retrieves the most recently set APR.\n * @return The current APR in UD7x3 format.\n */\n function getAPR() public view returns (uint16) {\n return _aprHistory.getAPR();\n }\n\n /**\n * @notice Enables redirection of rewards from one account to another.\n * @param from The address of the account to redirect rewards from.\n * @param to The address of the account to redirect rewards to.\n */\n function startRewardsRedirection(\n address from,\n address to\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\n // Ensure the address is not already redirecting rewards\n require(rewardsRedirectsFromTo[from] == address(0), \"L62\");\n\n // Ensure neither 'from' nor 'to' are the zero address\n require(from != address(0), \"L12\");\n require(to != address(0), \"L13\");\n\n // Ensure 'from' and 'to' addresses are distinct\n require(from != to, \"L14\");\n\n // Ensure function caller is either the owner or the 'from' address\n require(_msgSender() == owner() || _msgSender() == from, \"L15\");\n\n // Distribute current rewards and reset investment periods of both accounts\n _beforeInvestmentChange(from, true);\n _beforeInvestmentChange(to, true);\n\n // Activate rewards redirection\n rewardsRedirectsFromTo[from] = to;\n rewardsRedirectsToFrom[to].push(from);\n }\n\n /**\n * @notice Disable an active rewards redirection.\n * @param from The address of the account to stop redirecting rewards from.\n * @param to The address of the account to stop redirecting rewards to.\n */\n function stopRewardsRedirection(\n address from,\n address to\n ) public whenNotPaused notBlacklisted(from) notBlacklisted(to) {\n // Ensure neither 'from' nor 'to' are the zero address\n require(from != address(0), \"L16\");\n require(to != address(0), \"L17\");\n\n // Ensure function caller is either the owner or the 'from' address\n require(_msgSender() == owner() || _msgSender() == from, \"L18\");\n\n // Ensure a rewards redirection was active\n require(rewardsRedirectsFromTo[from] == to, \"L19\");\n\n // Distribute current rewards and reset investment periods of both accounts\n _beforeInvestmentChange(from, true);\n _beforeInvestmentChange(to, true);\n\n // Retrieve 'from' index in the redirection array of 'to'\n int256 fromIndex = -1;\n for (uint256 i = 0; i < rewardsRedirectsToFrom[to].length; i++) {\n if (rewardsRedirectsToFrom[to][i] == from) {\n fromIndex = int256(i);\n break;\n }\n }\n\n // fromIndex should never be -1 at this point\n assert(fromIndex >= 0);\n\n // Deactivate rewards redirection\n rewardsRedirectsFromTo[from] = address(0);\n rewardsRedirectsToFrom[to][uint256(fromIndex)] = rewardsRedirectsToFrom[to][\n rewardsRedirectsToFrom[to].length - 1\n ];\n rewardsRedirectsToFrom[to].pop();\n }\n\n /**\n * @notice Retrieves the total amount of tokens invested by the given account.\n * @dev Derived contracts must implement this function.\n * @param account The account to get the investment of.\n * @return The total amount of tokens invested by the given account.\n */\n function _investmentOf(address account) internal view virtual returns (uint256);\n\n /**\n * @notice Distributes a specified amount of rewards to a given account.\n * @dev Derived contracts may optionally implement this function.\n * @dev Implementations must return true to indicate a successful distribution, and\n * false otherwise. If it returns false, the rewards will be added to the account's\n * virtual balance, in order to be claimed later.\n * @param account The account to claim the rewards of.\n * @param amount The amount of rewards to claim.\n * @return Whether the rewards distribution was successfull.\n */\n function _distributeRewards(address account, uint256 amount) internal virtual returns (bool) {\n account; // Silence unused variables warning\n amount;\n return false;\n }\n\n /**\n * @notice Computes the rewards accrued over a specified period of time, based on a\n * given APR and amount of invested tokens.\n * @dev For further details, see \"InvestUpgradeable > Rewards calculation\" section of\n * the whitepaper.\n * @param beginTimestamp The moment the period commenced.\n * @param endTimestamp The moment the period concluded.\n * @param aprUD7x3 The APR during this period, in UD7x3 format.\n * @param investedAmount The amount of tokens deposited/invested during the period.\n * @return The amount of rewards generated during the period.\n */\n function _calculatePeriodRewards(\n uint40 beginTimestamp,\n uint40 endTimestamp,\n uint16 aprUD7x3,\n uint256 investedAmount\n ) internal view returns (uint256) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Compute the number of elapsed years\n uint256 elapsedTimeSUD = SUD.fromInt(endTimestamp - beginTimestamp, d);\n uint256 elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1, d)) / SUD.fromInt(365 days, d);\n\n // Compute the growth in invested amount (thanks to rewards)\n uint256 aprSUD = SUD.fromRate(aprUD7x3, d);\n uint256 growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1, d);\n\n // Compute and return the rewards\n uint256 investedAmountSUD = SUD.fromAmount(investedAmount, d);\n uint256 rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(rewardsSUD, d);\n }\n\n /**\n * @notice Computes the sum of given account's invested amount, plus invested amount\n * of all accounts that recursively redirect rewards to this account.\n * @param account The account to calculate the deep investment of.\n * @return deepInvestedAmount The deep invested amount.\n */\n function _deepInvestmentOf(address account) internal view returns (uint256 deepInvestedAmount) {\n // Consider account's direct investment\n deepInvestedAmount += _investmentOf(account);\n\n // But also the deep investments of all accounts redirecting rewards to this account\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\n deepInvestedAmount += _deepInvestmentOf(rewardsRedirectsToFrom[account][i]);\n }\n }\n\n /**\n * @notice Computes the amount of unclaimed/undistributed rewards of a given account.\n * @dev For further details, see \"InvestUpgradeable > Rewards calculation\" section of\n * the whitepaper.\n * @param account The account to calculate the unclaimed rewards of.\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\n * @return rewards The amount of unclaimed/undistributed rewards of the given account.\n */\n function _rewardsOf(\n address account,\n bool autocompound\n ) internal view returns (uint256 rewards) {\n // Retrieve account's investment details\n AccountDetails memory details = accountsDetails[account];\n\n // Retrieve account's deep invested amount\n uint256 investedAmount = _deepInvestmentOf(account);\n\n // Return 0 if the account has never invested or has no invested amount\n if (details.period.timestamp == 0 || investedAmount == 0) return 0;\n\n // Retrieve reference and data of APR checkpoint at which started investment period\n APRH.Reference memory currRef = details.period.ref;\n APRH.CheckpointData memory currCheckpoint = _aprHistory.getDataFromReference(currRef);\n\n // Retrieve reference of latest APR checkpoint\n APRH.Reference memory latestRef = _aprHistory.getLatestReference();\n\n // 1) Fill rewards with virtual balance (rewards not claimed/distributed yet)\n // See \"InvestUpgradeable > Yield calculation > 1)\" section of the whitepaper\n rewards = details.virtualBalance;\n\n // If start checkpoint is not the latest one\n if (!APRH.eq(currRef, latestRef)) {\n // Retrieve reference and data of APR checkpoint that comes after start checkpoint\n APRH.Reference memory nextRef = APRH.incrementReference(currRef);\n APRH.CheckpointData memory nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\n\n // 2) Calculate rewards from investment period start to next checkpoint\n // See \"InvestUpgradeable > Yield calculation > 2)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n details.period.timestamp,\n nextCheckpoint.timestamp,\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n\n // 3) Calculate rewards for each crossed pair of checkpoints\n // See \"InvestUpgradeable > Yield calculation > 3)\" section of the whitepaper\n while (true) {\n // Set next checkpoint as the current one\n currRef = nextRef;\n currCheckpoint = nextCheckpoint;\n\n // Break if current checkpoint is the latest one\n if (APRH.eq(currRef, latestRef)) break;\n\n // Else, retrieve the new next checkpoint\n nextRef = APRH.incrementReference(currRef);\n nextCheckpoint = _aprHistory.getDataFromReference(nextRef);\n\n // Calculate rewards between the current pair of checkpoints\n rewards += _calculatePeriodRewards(\n currCheckpoint.timestamp,\n nextCheckpoint.timestamp,\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n }\n\n // 4) Calculate rewards from the latest checkpoint to now\n // See \"InvestUpgradeable > Yield calculation > 4)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n currCheckpoint.timestamp,\n uint40(block.timestamp),\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n } else {\n // 2.bis) Calculate rewards from investment period start to now\n // See \"InvestUpgradeable > Yield calculation > 2.bis)\" section of the whitepaper\n rewards += _calculatePeriodRewards(\n details.period.timestamp,\n uint40(block.timestamp),\n currCheckpoint.aprUD7x3,\n investedAmount + (autocompound ? rewards : 0)\n );\n }\n }\n\n /**\n * @notice Recursively resets the investment period of the specified account and of\n * all accounts that directly or indirectly redirect rewards to this account.\n * @param account The account to deeply reset the investment period of.\n */\n function _deepResetInvestmentPeriodOf(address account) internal {\n // Reset account investment period timestamp and APR checkpoint to latest ones\n accountsDetails[account].period.timestamp = uint40(block.timestamp);\n accountsDetails[account].period.ref = _aprHistory.getLatestReference();\n\n // Also reset the ones of all accounts that recursively redirect rewards to this account\n for (uint256 i = 0; i < rewardsRedirectsToFrom[account].length; i++) {\n _deepResetInvestmentPeriodOf(rewardsRedirectsToFrom[account][i]);\n }\n }\n\n /**\n * @notice Hook to be invoked before the invested amount of an account changes. It\n * ensures that rewards are distributed and that account's investment period is reset.\n * @param account The account whose invested amount is going to change.\n * @param autocompound Whether to autocompound the rewards between APR checkpoints.\n */\n function _beforeInvestmentChange(address account, bool autocompound) internal {\n // This hook is called inside LToken._beforeTokenTransfer() and as new tokens are\n // minted in LToken._distributeRewards(), this guards against infinite loop.\n if (_isClaiming) return;\n\n // LToken._beforeTokenTransfer() calls this hook for both involved addresses.\n // As first call will treat both addresses, the second call would be redundant.\n // Therefore, we skip accounts already processed in this block to save up some gas.\n if (accountsDetails[account].period.timestamp == uint40(block.timestamp)) return;\n\n // If account redirects its rewards\n address redirectRewardsTo = rewardsRedirectsFromTo[account];\n if (redirectRewardsTo != address(0)) {\n // Call hook on redirection target (this will indirectly reset the investment\n // of this source account) and return\n _beforeInvestmentChange(redirectRewardsTo, autocompound);\n return;\n }\n\n // Else, compute account's undistributed/unclaimed rewards\n uint256 rewards = _rewardsOf(account, autocompound);\n\n // If there are some rewards\n if (rewards > 0) {\n // Try to distribute rewards to account\n _isClaiming = true;\n bool distributed = _distributeRewards(account, rewards);\n _isClaiming = false;\n\n // If rewards have not been distributed, accumulate them in account's virtual balance\n if (!distributed) accountsDetails[account].virtualBalance = rewards;\n }\n\n // Finally, deeply reset investment period of the account\n _deepResetInvestmentPeriodOf(account);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/abstracts/RecoverableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n// Conracts\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./GlobalOwnableUpgradeable.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\n/**\n * @title RecoverableUpgradeable\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Derived contracts are provided with helper functions allowing the recovery of\n * assets accidentally sent to them.\n *\n * @dev Where are utilities Ether, ERC721, etc.?\n * This abstract contract currently supports only ERC20 tokens. Derived contracts\n * in this codebase currently do not implement the necessary functions to receive Ether\n * or ERC721/ERC1155 tokens, so no recovery functions are provided for these assets.\n *\n * @dev For further details, see \"RecoverableUpgradeable\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nabstract contract RecoverableUpgradeable is Initializable, GlobalOwnableUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /**\n * @notice Initializer functions of the contract. They replace the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function __Recoverable_init(address globalOwner_) internal onlyInitializing {\n __GlobalOwnable_init(globalOwner_);\n __Recoverable_init_unchained();\n }\n\n function __Recoverable_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Recovers a specified amount of a given token address. Will fail if the\n * contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) public virtual onlyOwner {\n // Ensure the specified amount is not zero\n require(amount > 0, \"L10\");\n\n // Create a reference to token's contract\n IERC20Upgradeable tokenContract = IERC20Upgradeable(tokenAddress);\n\n // Ensure there is enough token to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L11\");\n\n // Transfer the recovered token amount to the sender\n tokenContract.safeTransfer(_msgSender(), amount);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add\n * new 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" - }, - "contracts/src/DummyLDYStaking.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\n/**\n * @title LDYStaking\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\n * this one is deployed.\n *\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\n * one the LToken contract relies on.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDYStaking is Ownable2Step {\n /**\n * @notice Holds a mapping of addresses that default to the highest staking tier.\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\n */\n mapping(address => bool) public highTierAccounts;\n\n /**\n * @notice Update high tier status of a given account.\n * @param account The account to update the high tier status of.\n */\n function setHighTierAccount(address account, bool status) public onlyOwner {\n highTierAccounts[account] = status;\n }\n\n /**\n * @dev Dummy tierOf() function that always return that the given account is not\n * elligible to any LDY staking tier, except if the account is in the\n * highTierAccounts mapping.\n * @param account The account to check the tier of.\n */\n function tierOf(address account) public view returns (uint256 tier) {\n if (highTierAccounts[account]) return 3;\n return 0;\n }\n}\n" - }, - "contracts/src/GenericERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {ERC20Burnable} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @notice Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls.\n * It represents:\n * - a FIAT-based stablecoin when used to test the LToken contract,\n * - the $LDY token when used to test the LDYStaking contract.\n * This contract accept decimals as constructor argument, so it can be used to to\n * easily test different decimals scenarios.\n */\ncontract GenericERC20 is ERC20, ERC20Burnable {\n uint8 private _decimals;\n\n constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) {\n _decimals = decimals_;\n }\n\n function mint(uint256 amount) public {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n /**\n * Used in tests to test different decimals scenarios.\n */\n function setDecimals(uint8 decimals_) public {\n _decimals = decimals_;\n }\n}\n" - }, - "contracts/src/GlobalBlacklist.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalBlacklist\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\n * Ledgity Yield codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\n * and getter functions to easily check against this global blacklist.\n *\n * @dev For further details, see \"GlobalBlacklist\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Mapping of accounts to their blacklist status.\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\n */\n mapping(address => bool) private _list;\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Adds a given account to the blacklist.\n * @param account The account's address to be blacklisted.\n */\n function blacklist(address account) external onlyOwner {\n require(account != address(0), \"L20\");\n _list[account] = true;\n }\n\n /**\n * @notice Removes a given account from the blacklist.\n * @param account The account's address to be un-blacklisted.\n */\n function unBlacklist(address account) external onlyOwner {\n _list[account] = false;\n }\n\n /**\n * @notice Checks whether a given account is blacklisted.\n * @param account Address of the account to check.\n * @return 'true' if the account is blacklisted, 'false' otherwise\n */\n function isBlacklisted(address account) external view returns (bool) {\n // Gas optimization: Avoid accessing storage if account is the zero address\n // (e.g, during a mint or a burn of tokens)\n if (account == address(0)) return false;\n\n // Else, return current account's blacklist status\n return _list[account];\n }\n}\n" - }, - "contracts/src/GlobalOwner.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {Ownable2StepUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\n/**\n * @title GlobalOwner\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds the address of a global owner account shared by all contracts of the\n * Ledgity Yield's codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalOwnableUpgradeable abstract contract. This provides them with an overriden\n * owner() function that retrieves the owner's address from this contract instead.\n *\n * @dev For further details, see \"GlobalOwner\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalOwner is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable {\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize() public initializer {\n __Ownable2Step_init();\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n}\n" - }, - "contracts/src/GlobalPause.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalPause\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global pause state shared by all contracts of the Ledgity Yield\n * codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalPausableUpgradeable abstract contract. This provides them with an overriden\n * paused() function that retrieves the pause state from this contract instead.\n *\n * @dev For further details, see \"GlobalPause\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalPause is\n Initializable,\n UUPSUpgradeable,\n GlobalOwnableUpgradeable,\n PausableUpgradeable\n{\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __Pausable_init();\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @dev Public implementation of PausableUpgradeable's pausing and unpausing functions\n * but restricted to contract's owner.\n */\n function pause() public onlyOwner {\n _pause();\n }\n\n function unpause() public onlyOwner {\n _unpause();\n }\n}\n" - }, - "contracts/src/interfaces/ITransfersListener.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\ninterface ITransfersListener {\n function onLTokenTransfer(address from, address to, uint256 amount) external;\n}\n" - }, - "contracts/src/libs/APRHistory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n/**\n * @title APRHistory\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This library offers utilities to efficiently maintain the history of an\n * on-chain APR (Annual Percentage Rate) state. Each entry in this history is called\n * a \"checkpoint\".\n *\n * @dev Intuition:\n * Each checkpoint in an APR history consists of two data:\n * - the creation timestamp\n * - the APR at that time\n *\n * Given that reading and writing to storage slots are among the most costly operations\n * in Solidity, this library provides a way to store those data in a way that minimizes\n * the number of used storage slots.\n *\n * Instead of storing each checkpoint in a separate storage slot, this library\n * facilitates the packing of up to 4 checkpoints in a single storage slot.\n *\n * @dev Definitions:\n * - Checkpoint: A record of an APR change\n * - Pack: A collection of 4 checkpoints stored in a single storage slot\n * - History: A dynamic array of packs\n * - Reference: A storage pointer to a checkpoint in the APR history\n * - CheckpointData: An in-memory representation of a checkpoint data\n *\n * @dev Value limitation:\n * This library can accommodate APRs only up to 65.536%. This is however sufficient for\n * APR in LToken contract, which is expected to remain below 10%.\n *\n * @dev For further details, see \"APRHistory\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary APRHistory {\n /**\n * @notice Represents data of a checkpoint extracted from the on-chain history.\n * For on-chain representation see \"Pack\" struct.\n * @param aprUD7x3 APR in UD7x3 format (e.g., 12345 = 12.345%).\n * @param timestamp Timestamp of the checkpoint's creation.\n */\n struct CheckpointData {\n uint16 aprUD7x3; // Allows up to 65.536%\n uint40 timestamp; // Supports dates up to 20/02/36812\n }\n\n /**\n * @notice Represents how APR checkpoints are stored on chain. Each pack can contain\n * the data 4 checkpoints. Packs are then stored in a dynamic array (the history).\n * @param aprsUD7x3 Array of checkpoints' APRs.\n * @param timestamps Array of checkpoints' timestamps.\n * @param cursor Index of the next checkpoint to be written.\n */\n struct Pack {\n uint16[4] aprsUD7x3;\n uint40[4] timestamps;\n uint32 cursor;\n }\n\n /**\n * @notice Represents a storage pointer to a specific checkpoint in the history.\n * @param packIndex Index of the pack the checkpoint belongs to.\n * @param cursorIndex Index of the checkpoint in this pack (between 0 and 3).\n */\n struct Reference {\n uint256 packIndex;\n uint32 cursorIndex;\n }\n\n /**\n * @notice Compares two checkpoints references.\n * @param ref1 The first reference to compare.\n * @param ref2 The second reference to compare.\n * @return Whether the two references points to the same checkpoint.\n */\n function eq(Reference memory ref1, Reference memory ref2) external pure returns (bool) {\n return ref1.packIndex == ref2.packIndex && ref1.cursorIndex == ref2.cursorIndex;\n }\n\n /**\n * @notice Returns the reference of the checkpoint that should come right after the\n * referenced checkpoint in the APR history.\n * @param ref The reference to be incremented.\n * @return The incremented reference.\n */\n function incrementReference(Reference memory ref) public pure returns (Reference memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L1\");\n\n // If the given ref is the last slot in its pack, return ref of next pack's first slot\n if (ref.cursorIndex == 3) return Reference(ref.packIndex + 1, 0);\n //\n // Else, return ref of next slot in current pack\n else return Reference(ref.packIndex, ref.cursorIndex + 1);\n }\n\n /**\n * @notice Extracts checkpoint data from a given reference and in APR history.\n * @param self The APR history to extract the checkpoint from.\n * @param ref The reference of the checkpoint data to extract.\n * @return The extracted checkpoint's data.\n */\n function getDataFromReference(\n Pack[] storage self,\n Reference memory ref\n ) public view returns (CheckpointData memory) {\n // Ensure cursor index of the given ref is within valid range [0, 3]\n require(ref.cursorIndex <= 3, \"L2\");\n\n // Ensure pack index of the given ref exists in history\n require(ref.packIndex < self.length, \"L3\");\n\n // Retrieve pack data from history\n Pack memory pack = self[ref.packIndex];\n\n // Ensure cursor index of the given ref has been written\n require(ref.cursorIndex < pack.cursor, \"L4\");\n\n // Build and return the checkpoint data\n return\n CheckpointData({\n aprUD7x3: pack.aprsUD7x3[ref.cursorIndex],\n timestamp: pack.timestamps[ref.cursorIndex]\n });\n }\n\n /**\n * @notice Retrieves the reference to the most recently added checkpoint in the APR history.\n * @param self The history to extract the reference from.\n * @return The reference of the latest checkpoint.\n */\n function getLatestReference(Pack[] storage self) public view returns (Reference memory) {\n // Ensure the given history is not empty\n require(self.length != 0, \"L5\");\n\n // Retrieve latest pack's index and cursor\n uint256 packIndex = self.length - 1;\n uint32 packCursor = self[packIndex].cursor;\n\n // If this is the first pack ever, ensure it is not empty\n if (packIndex == 0) require(packCursor != 0, \"L6\");\n\n // If the pack is empty, return ref of previous pack's latest slot\n if (packCursor == 0) return Reference(packIndex - 1, 3);\n //\n // Else, return ref of previous slot in current pack\n else return Reference(packIndex, packCursor - 1);\n }\n\n /**\n * @notice Appends a new empty pack to the end of the given APR history array.\n * @param self The APR history to append an empty to.\n */\n function newBlankPack(Pack[] storage self) internal {\n // If history is not empty, ensure the latest pack is full\n require(self.length == 0 || getLatestReference(self).cursorIndex == 3, \"L7\");\n\n // Push a new blank pack to the history array\n self.push(\n Pack({\n aprsUD7x3: [uint16(0), uint16(0), uint16(0), uint16(0)],\n timestamps: [uint40(0), uint40(0), uint40(0), uint40(0)],\n cursor: 0\n })\n );\n }\n\n /**\n * @notice Write a new APR checkpoint at the end of the given history array.\n * @param self The array of packs to write the new checkpoint to.\n * @param aprUD7x3 The new APR in UD7x3 format.\n */\n function setAPR(Pack[] storage self, uint16 aprUD7x3) external {\n // Determine the reference where the new checkpoint should be written\n Reference memory newRef = self.length == 0\n ? Reference(0, 0)\n : incrementReference(getLatestReference(self));\n\n // If pack to be written doesn't exist yet, push a new blank pack in history\n if (newRef.packIndex >= self.length) newBlankPack(self);\n\n // Retrieve the pack where the new checkpoint will be stored\n Pack memory pack = self[newRef.packIndex];\n\n // Add new checkpoint's data to the pack\n pack.aprsUD7x3[newRef.cursorIndex] = aprUD7x3;\n pack.timestamps[newRef.cursorIndex] = uint40(block.timestamp);\n\n // Increment the pack's cursor\n pack.cursor++;\n\n // Write the updated pack in storage\n self[newRef.packIndex] = pack;\n }\n\n /**\n * @notice Retrieves the APR of the latest checkpoint written in the APR history.\n * @param self The history array to read APR from.\n * @return The latest checkpoint's APR.\n */\n function getAPR(Pack[] storage self) public view returns (uint16) {\n // Retrieve the latest checkpoint data\n Reference memory ref = getLatestReference(self);\n CheckpointData memory data = getDataFromReference(self, ref);\n\n // Return the latest checkpoint's APR\n return data.aprUD7x3;\n }\n}\n" - }, - "contracts/src/libs/SUD.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\n\n/**\n * @title SUD\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice SUD serves as an intermediary number format for calculations within this\n * codebase. It ensures consistency and reduces precision losses. This library\n * facilitates conversions between various number formats and the SUD format.\n *\n * @dev Intuition:\n * This codebase employs the UD (unsigned decimal fixed-point numbers) format to\n * represent both percentage rates and tokens amounts.\n *\n * Rates are expressed in UD7x3 format, whereas the format for tokens amounts depends on\n * the decimals() value of the involved tokens.\n *\n * Three challenges arise from this:\n * 1) To compute values together, it's essential that they are in the same format\n * 2) Calculations involving consecutive divisions on UD numbers lead to accumulated\n * precision loss (because division shrinks). A common approach is to scale up and\n * down values by a few decimals before and after performing calculations.\n * 3) Given that rates use the UD7x3 format, if we decided to scale them to and from\n * the number of decimals of the involved token, 1 to 3 of the rates' decimals would\n * be shrunk in case token's decimals number is in [0, 2].\n *\n * To address these challenges, this library provides the SUD format, which acts as a\n * consistent and scaled intermediate format to perform calculations.\n *\n * SUD is an acronym for either \"Scaled UD\" or \"Safe UD\".\n *\n * @dev Definitions:\n * - Integer: A number without fractional part, e.g., block.timestamp\n * - UD: A decimal unsigned fixed-point number. The \"UD\" notation is inspired from\n * libraries like [prb-math](https://github.com/PaulRBerg/prb-math/)\n * - Amount: A token amount. A UD with an unknown repartition of digits between integral\n * and fractional parts (as token amounts have variable decimal numbers)\n * - Rate: A percentage rate. An UD with 7 integral digits and 3 fractional ones (= UD7x3)\n * - SUD: An intermediate format to perform calculations involving Rates and Amounts. A UD\n * with 3 more decimals than the involved UD with the highest decimals number. As\n * rates are represented by UD7x3, a SUD number has at least 6 decimals (3+3) and\n * so ranges from UD71x6 to UD0x77 formats.\n *\n * @dev A conversion library:\n * This library provides utilities to perform the following conversions:\n * - Amount <--> SUD\n * - Rate (UD7x3) <--> SUD\n * - Integer <--> SUD\n *\n * @dev Why scaling by 3 decimals?\n * - It provides an adequate degree of precision for this codebase,\n * - It enables the conversion of a UD7x3 rate to SUD format by merely scaling it up by\n * the involved token's decimal number, so is gas efficient.\n *\n * @dev Why internal functions?\n * The functions of this library are not set to external because incorporating them\n * directly into contracts is more gas-efficient. Given their minimal size and frequent\n * usage in the InvestUpgradeable, LDYStaking, and LToken contracts, any bytecode savings\n * from making them external are negated by the additional bytecode required for external\n * calls to this library. This can be observed by comparing the output of `bun cc:size`\n * when those functions's visibility is set to external or internal.\n *\n * @dev Precision warning:\n * While this library mitigates precision loss during calculations on UD numbers, it's\n * important to note that tokens with lower decimal counts and supply inherently suffer\n * more from precision loss. Conversely, tokens with higher decimal counts and supply\n * will experience less precision loss.\n *\n * @dev For further details, see \"SUD\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\nlibrary SUD {\n /**\n * @notice Retrieves decimals number of the given ERC20 contract address.\n * @param tokenAddress The address to retrieve decimals number from.\n * @return decimals The decimals number of the given ERC20 contract address.\n */\n function decimalsOf(address tokenAddress) internal view returns (uint256 decimals) {\n return IERC20MetadataUpgradeable(tokenAddress).decimals();\n }\n\n /**\n * @notice Convert a given token amount into SUD format.\n * @param nAmount The token amount to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The amount in SUD format\n */\n function fromAmount(uint256 nAmount, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nAmount * 10 ** (6 - decimals);\n\n // Else return a number with decimals+3 fractional digits\n return nAmount * 10 ** 3;\n }\n\n /**\n * @notice Convert a given SUD number into token amount format.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nAmount The number in amount format\n */\n function toAmount(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nAmount) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** (6 - decimals);\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** 3;\n }\n\n /**\n * @notice Converts a given UD7x3 rate into SUD format.\n * @param nUD7x3 The UD7x3 rate to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The rate in SUD format.\n */\n function fromRate(uint256 nUD7x3, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return nUD7x3 * 10 ** 3;\n\n // Else, return a number with decimals+3 fractional digits\n return nUD7x3 * 10 ** decimals;\n }\n\n /**\n * @notice Converts a given SUD number into a UD7x3 rate.\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nUD7x3 The number in UD7x3 rate format.\n */\n function toRate(uint256 nSUD, uint256 decimals) internal pure returns (uint256 nUD7x3) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 3;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** decimals;\n }\n\n /**\n * @notice Converts a given integer into SUD format.\n * @param n The integer to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return nSUD The integer in SUD format.\n */\n function fromInt(uint256 n, uint256 decimals) internal pure returns (uint256 nSUD) {\n // If token decimals < 3, return a UD71x6 number\n if (decimals < 3) return n * 10 ** 6;\n\n // Else, return a number with decimals+3 fractional digits\n return n * 10 ** (decimals + 3);\n }\n\n /**\n * @notice Converts a given SUD number as an integer (all decimals shrinked).\n * @param nSUD The SUD number to convert.\n * @param decimals The decimals number of the involved ERC20 token.\n * @return n The SUD number as an integer.\n */\n function toInt(uint256 nSUD, uint256 decimals) internal pure returns (uint256 n) {\n // If token decimals < 3, convert from a UD71x6 number\n if (decimals < 3) return nSUD / 10 ** 6;\n\n // Else, convert from a number with decimals+3 fractional digits\n return nSUD / 10 ** (decimals + 3);\n }\n}\n" - }, - "contracts/src/LToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n// Contracts\nimport {ERC20WrapperUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\";\nimport \"./abstracts/base/ERC20BaseUpgradeable.sol\";\nimport {InvestUpgradeable} from \"./abstracts/InvestUpgradeable.sol\";\nimport {LDYStaking} from \"./DummyLDYStaking.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {SUD} from \"./libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\nimport {ITransfersListener} from \"./interfaces/ITransfersListener.sol\";\n\n/**\n * @title LToken\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\n * the form of additional L-Tokens, which are auto-compounded over time.\n *\n * @dev Definitions:\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\n * - Instant: Processed immediately.\n * - Request: Queued for later processing.\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\n * - Request ID: The index of a withdrawal request in the queue array.\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\n * expected ways and are so considered safe to use by the contract.\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\n * processing.\n *\n * Note that words between parenthesis are sometimes omitted for brevity.\n *\n * @dev Deployment notice:\n * This contract can safely receive funds immediately after initialization. (i.e., there\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\n * replace ASAP owner and fund wallets with multi-sig wallets.\n *\n * @dev For further details, see \"LToken\" section of whitepaper.\n * @custom:oz-upgrades-unsafe-allow external-library-linking\n * @custom:security-contact security@ledgity.com\n */\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /// @dev Represents type of actions triggering ActivityEvent events.\n enum Action {\n Deposit,\n Withdraw\n }\n\n /// @dev Represents different status of actions triggering ActivityEvent events.\n enum Status {\n Queued,\n Cancelled,\n Success,\n Moved\n }\n\n /**\n * @notice Represents a withdrawal request in the queue.\n * @dev A request fits in a single storage slot (32 bytes).\n * @param account The account that initiated the request.\n * @param amount The amount of underlying tokens requested.\n */\n struct WithdrawalRequest {\n address account; // 20 bytes\n uint96 amount; // 12 bytes\n }\n\n /// @notice Upper limit of retention rate.\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\n\n /// @notice Used in activity events to represent the absence of request ID.\n int256 private constant NO_ID = -1;\n\n /// @notice Holds a reference to the LDYStaking contract.\n LDYStaking public ldyStaking;\n\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\n address payable public withdrawer;\n\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\n address public fund;\n\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\n uint32 public feesRateUD7x3;\n\n /// @notice Holds the retention rate in UD7x3 format.\n uint32 public retentionRateUD7x3;\n\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\n uint256 public unclaimedFees;\n\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\n uint256 public totalQueued;\n\n /**\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\n */\n uint256 public usableUnderlyings;\n\n /// @notice Holds an ordered list of active withdrawal requests.\n WithdrawalRequest[] public withdrawalQueue;\n\n /// @notice Holds the index of the next withdrawal request to process in the queue.\n uint256 public withdrawalQueueCursor;\n\n /**\n * @notice Holds a list of all currently frozen withdrawal requests.\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\n * it from blocking the queue.\n */\n WithdrawalRequest[] public frozenRequests;\n\n /**\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\n */\n ITransfersListener[] public transfersListeners;\n\n /**\n * @notice Emitted to inform listeners about a change in the contract's TVL.\n * @dev TVL = realTotalSupply()\n * @param newTVL The new TVL of the contract.\n */\n event TVLChangeEvent(uint256 newTVL);\n\n /**\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\n * @param account The account involved in the activity.\n * @param action The type of activity.\n * @param amount The amount of underlying tokens involved in the activity.\n * @param newStatus The new status of the activity.\n * @param newId The new ID of the request if it has been moved in the queue.\n */\n event ActivityEvent(\n int256 indexed id,\n address indexed account,\n Action indexed action,\n uint256 amount,\n uint256 amountAfterFees,\n Status newStatus,\n int256 newId\n );\n\n /**\n * @notice Emitted to inform listeners that some rewards have been minted.\n * @param account The account that received the rewards.\n * @param balanceBefore The balance of the account before the minting.\n * @param rewards The amount of minted rewards.\n */\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\n\n /// @notice Reverts if the function caller is not the withdrawer wallet.\n modifier onlyWithdrawer() {\n require(_msgSender() == withdrawer, \"L39\");\n _;\n }\n\n /// @notice Reverts if the function caller is not the fund wallet.\n modifier onlyFund() {\n require(_msgSender() == fund, \"L40\");\n _;\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address ldyStaking_,\n address underlyingToken\n ) public initializer {\n // Initialize ERC20 base.\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\n __ERC20Base_init(\n globalOwner_,\n globalPause_,\n globalBlacklist_,\n string(abi.encodePacked(\"Ledgity \", underlyingSymbol)),\n string(abi.encodePacked(\"L\", underlyingSymbol))\n );\n\n // IMPORTANT: Below calls must not be restricted to owner at any point.\n // This is because the GlobalOwner contract may not be a fresh one, and so\n // the contract deployer may not be the owner anymore after ERC20Base init.\n\n // Initialize other parents contracts.\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\n __Invest_init_unchained(address(this));\n\n // Set LDYStaking contract\n ldyStaking = LDYStaking(ldyStaking_);\n\n // Set initial withdrawal fees rate to 0.3%\n feesRateUD7x3 = 300;\n\n // Set initial retention rate to 10%\n retentionRateUD7x3 = 10_000;\n\n // Default withdrawer and fund wallet to contract owner address. This prevents\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\n withdrawer = payable(owner());\n fund = payable(owner());\n }\n\n /**\n * @notice Required override of decimals() which is implemented by both\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\n * decimals amount of the underlying stablecoin token.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function decimals()\n public\n view\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\n returns (uint8)\n {\n return ERC20WrapperUpgradeable.decimals();\n }\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @notice Updates the current withdrawal fee rate.\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\n */\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\n feesRateUD7x3 = feesRateUD7x3_;\n }\n\n /**\n * @notice Updates the current underlying token retention rate.\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\n * deposited assets will ever be exposed in this contract (reduces attack surface).\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\n */\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \"L41\");\n retentionRateUD7x3 = retentionRateUD7x3_;\n }\n\n /**\n * @notice Updates the address of LDYStaking contract.\n * @param ldyStakingAddress The address of the new LDYStaking contract.\n */\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\n ldyStaking = LDYStaking(ldyStakingAddress);\n }\n\n /**\n * @notice Updates the address of the withdrawer wallet.\n * @param withdrawer_ The address of the new withdrawer wallet.\n */\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\n // Ensure address is not the zero address (pre-processing fees would be lost else)\n require(withdrawer_ != address(0), \"L63\");\n\n // Set new withdrawer wallet's address\n withdrawer = withdrawer_;\n }\n\n /**\n * @notice Updates the address of the fund wallet.\n * @param fund_ The address of the new fund wallet.\n */\n function setFund(address payable fund_) public onlyOwner {\n // Ensure address is not the zero address (deposited tokens would be lost else)\n require(fund_ != address(0), \"L64\");\n\n // Set new fund wallet's address\n fund = fund_;\n }\n\n /**\n * @notice Adds a new contract to the L-Token transfers list.\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\n * specified contract will be called.\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\n * contracts that are not owned by the Ledgity team.\n * @param listenerContract The address of the new transfers listener contract.\n */\n function listenToTransfers(address listenerContract) public onlyOwner {\n transfersListeners.push(ITransfersListener(listenerContract));\n }\n\n /**\n * @notice Removes a contract from the L-Token transfers list.\n * @dev The onLTokenTransfer() function of the specified contract will not be called\n * anymore each time a L-Token transfer occurs.\n * @param listenerContract The address of the listener contract.\n */\n function unlistenToTransfers(address listenerContract) public onlyOwner {\n // Find index of listener contract in transferListeners array\n int256 index = -1;\n uint256 transfersListenersLength = transfersListeners.length;\n for (uint256 i = 0; i < transfersListenersLength; i++) {\n if (address(transfersListeners[i]) == listenerContract) {\n index = int256(i);\n break;\n }\n }\n\n // Revert if given contract wasn't listening to transfers\n require(index > -1, \"L42\");\n\n // Else, remove transfers listener contract from listeners array\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\n transfersListeners.pop();\n }\n\n /**\n * @notice Retrieves the amount of given account's not yet minted rewards.\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\n * context of LToken, this function returns the amount of rewards that have not been\n * distributed/minted yet to the specified account.\n * @dev This is particularly useful for off-chain services to display charts and\n * statistics, as seen in the Ledgity Yield's frontend.\n * @param account The account to check the unminted rewards of.\n * @return The amount of account's unminted rewards.\n */\n function unmintedRewardsOf(address account) public view returns (uint256) {\n return _rewardsOf(account, true);\n }\n\n /**\n * @notice Retrieves the \"real\" balance of an account, i.e., excluding its not yet\n * minted/distributed rewards.\n * @param account The account to check the real balance of.\n * @return The real balance of the account.\n */\n function realBalanceOf(address account) public view returns (uint256) {\n return super.balanceOf(account);\n }\n\n /**\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\n * not been yet minted to the specified account.\n * @param account The account to check the total balance of.\n * @return The total balance of the account.\n */\n function balanceOf(address account) public view override returns (uint256) {\n return realBalanceOf(account) + unmintedRewardsOf(account);\n }\n\n /**\n * @notice Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\n * @return The real total supply of L-Tokens.\n */\n function realTotalSupply() public view returns (uint256) {\n return super.totalSupply();\n }\n\n /**\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\n * fees and L-Tokens currently in the withdrawal queue.\n * @return The total supply of L-Tokens.\n */\n function totalSupply() public view override returns (uint256) {\n return realTotalSupply() + totalQueued + unclaimedFees;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address.\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\n * token from being the underlying token.\n * @inheritdoc RecoverableUpgradeable\n */\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\n // Ensure the token is not the underlying token\n require(tokenAddress != address(underlying()), \"L43\");\n\n // Proceed to recovery\n super.recoverERC20(tokenAddress, amount);\n }\n\n /**\n * @notice Recovers underlying tokens accidentally sent to the contract.\n * @dev To prevent owner from being able to drain the contract, this function only\n * allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been\n * sent through fund() or deposit() functions.\n */\n function recoverUnderlying() external onlyOwner {\n // Compute the recoverable amount by taking the difference between the contract's\n // balance and the amount of usable underlying tokens\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\n\n // Revert if there is nothing to recover\n require(recoverableAmount > 0, \"L44\");\n\n // Else, proceed to underlying tokens recovery\n super.recoverERC20(address(underlying()), recoverableAmount);\n }\n\n /**\n * @notice Retrieves the amount of underlying tokens invested by the given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\n * LToken contract, the investment of an account is equal to its real balance.\n * @inheritdoc InvestUpgradeable\n */\n function _investmentOf(address account) internal view override returns (uint256) {\n return realBalanceOf(account);\n }\n\n /**\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract so\n * it can distribute rewards to accounts before each period reset.\n * @dev InvestUpgradeable contract already ensure that amount > 0.\n * @inheritdoc InvestUpgradeable\n */\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\n // Inform listeners of the rewards minting\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\n\n // Mint L-Tokens rewards to account\n _mint(account, amount);\n\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\n return true;\n }\n\n /**\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\n * called each time an account's balance is going to change.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\n * @inheritdoc ERC20BaseUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\n\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\n if (from != address(0)) _beforeInvestmentChange(from, true);\n if (to != address(0)) _beforeInvestmentChange(to, true);\n }\n\n /**\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\n * transfers listeners.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already checked in _beforeTokenTransfer().\n * @inheritdoc ERC20Upgradeable\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\n super._afterTokenTransfer(from, to, amount);\n\n // If some L-Token have been burned/minted, inform listeners of a TVL change\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\n\n // Trigger onLTokenTransfer() functions of all the transfers listeners\n for (uint256 i = 0; i < transfersListeners.length; i++) {\n transfersListeners[i].onLTokenTransfer(from, to, amount);\n }\n }\n\n /**\n * @notice Computes the maximum amount of underlying tokens that should be retained\n * by the contract (based on retention rate).\n * @return amount The expected amount of retained underlying tokens.\n */\n function getExpectedRetained() public view returns (uint256 amount) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert totalSupply and retentionRate to SUD\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\n\n // Compute and return expected retained amount\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(expectedRetainedSUD, d);\n }\n\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\n function _transferExceedingToFund() internal {\n // Retrieve the expected amount retained\n uint256 expectedRetained = getExpectedRetained();\n\n // If usable underlyings are less than or equal to expected retained, return\n if (usableUnderlyings <= expectedRetained) return;\n\n // Else, exceeding amount is equal to difference between those values\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= exceedingAmount;\n\n // Transfer the exceeding amount to the fund wallet\n underlying().safeTransfer(fund, exceedingAmount);\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L45\");\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\n * Use deposit() function instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L46\");\n }\n\n /**\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\n * @param amount The amount of underlying tokens to deposit.\n */\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough underlying tokens to deposit\n require(underlying().balanceOf(_msgSender()) >= amount, \"L47\");\n\n // Update usable underlyings balance accordingly\n usableUnderlyings += amount;\n\n // Inform listeners of the deposit activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Deposit,\n amount,\n amount,\n Status.Success,\n NO_ID\n );\n\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\n super.depositFor(_msgSender(), amount);\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\n * given amount.\n * @param account The account initiating the withdrawal.\n * @param amount The amount of the withdrawal.\n */\n function getWithdrawnAmountAndFees(\n address account,\n uint256 amount\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\n // If the account is eligible to staking tier 2, no fees are applied\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\n\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert amount and fees rate to SUD\n uint256 amountSUD = SUD.fromAmount(amount, d);\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\n\n // Compute fees and withdrawn amount (initial amount minus fees)\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\n fees = SUD.toAmount(feesSUD, d);\n withdrawnAmount = amount - fees;\n }\n\n /**\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\n * enough underlying tokens to cover the withdrawal.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestWithdrawal() function otherwise.\n * @param amount The amount L-Tokens to withdraw.\n */\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L48\");\n\n // Can the contract cover this withdrawal plus all already queued requests?\n bool cond1 = totalQueued + amount <= usableUnderlyings;\n\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\n\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\n if (!(cond1 || cond2)) revert(\"L49\");\n\n // Else, retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\n\n // Increase unclaimed fees amount accordingly\n unclaimedFees += fees;\n\n // Decrease usable underlyings balance accordingly\n usableUnderlyings -= withdrawnAmount;\n\n // Inform listeners of this instant withdrawal activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Withdraw,\n amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Burn withdrawal fees from the account\n _burn(_msgSender(), fees);\n\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\n super.withdrawTo(_msgSender(), withdrawnAmount);\n }\n\n /**\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\n * amount of underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n * @param amount The amount L-Tokens to withdraw.\n */\n function requestWithdrawal(\n uint256 amount\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L53\");\n\n // Ensure the requested amount doesn't overflow uint96\n require(amount <= type(uint96).max, \"L54\");\n\n // Ensure the sender attached the pre-paid processing gas fees\n require(msg.value == 0.003 * 10 ** 18, \"L55\");\n\n // Create withdrawal request data\n WithdrawalRequest memory request = WithdrawalRequest({\n account: _msgSender(),\n amount: uint96(amount)\n });\n\n // Will hold the request ID\n uint256 requestId;\n\n // Append request to the withdrawal queue:\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\n withdrawalQueueCursor--;\n requestId = withdrawalQueueCursor;\n withdrawalQueue[requestId] = request;\n }\n // - At the end else\n else {\n withdrawalQueue.push(request);\n requestId = withdrawalQueue.length - 1;\n }\n\n // Increase total amount queued accordingly\n totalQueued += amount;\n\n // Inform listeners of this new queued withdrawal activity event\n emit ActivityEvent(\n int256(requestId),\n _msgSender(),\n Action.Withdraw,\n amount,\n amount,\n Status.Queued,\n NO_ID\n );\n\n // Burn withdrawal L-Tokens amount from account's balance\n _burn(_msgSender(), amount);\n\n // Forward pre-paid processing gas fees to the withdrawer wallet\n (bool sent, ) = withdrawer.call{value: msg.value}(\"\");\n require(sent, \"L56\");\n }\n\n /**\n * @notice Processes queued withdrawal requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n * @dev For further details, see \"LToken > Withdrawals\" section of whitepaper.\n */\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\n // Accumulators variables, will be written on-chain after the loop\n uint256 cumulatedFees = 0;\n uint256 cumulatedWithdrawnAmount = 0;\n uint256 nextRequestId = withdrawalQueueCursor;\n\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\n // requests are increasing the queue length when moved at the end of the queue.\n uint256 queueLength = withdrawalQueue.length;\n\n // Iterate over requests to be processed\n while (nextRequestId < queueLength) {\n // Stop processing requests if there is not enough gas left to continue the\n // loop and properly end the function call. This prevents an attacker from\n // blocking the withdrawal processing by creating a ton of tiny requests so\n // this function call cannot fit anymore in block gas limit.\n if (gasleft() < 45000) break;\n\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\n\n // Skip empty request (processed big requests or cancelled requests)\n if (request.account == address(0)) {}\n //\n // If account has been blacklisted since request emission\n else if (isBlacklisted(request.account)) {\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request in the frozen requests list\n frozenRequests.push(request);\n }\n //\n // Or if request is a big request, move it at the end of the queue for now.\n // This request will be processed manually later using processBigQueuedRequest()\n else if (request.amount > getExpectedRetained() / 2) {\n // Inform listeners of this queued request being moved at the end of the queue\n emit ActivityEvent(\n int256(nextRequestId),\n _msgSender(),\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Moved,\n int256(withdrawalQueue.length)\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request at the end of the queue\n withdrawalQueue.push(request);\n }\n //\n // Else, continue request processing\n else {\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Break if the contract doesn't hold enough funds to cover the request\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\n\n // Accumulate fees and withdrawn amount\n cumulatedFees += fees;\n cumulatedWithdrawnAmount += withdrawnAmount;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(nextRequestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Transfer underlying tokens to account. Burning L-Tokens is not required\n // as equestWithdrawal() already did it.\n // Security note: Re-entrancy warning are disabled as the request has\n // just been deleted from the queue, it will so be skipped if trying to\n // process it again.\n // slither-disable-next-line reentrancy-no-eth\n underlying().safeTransfer(request.account, withdrawnAmount);\n }\n\n // Increment next request ID\n nextRequestId++;\n }\n\n // Increase unclaimed fees by the amount of cumulated fees\n unclaimedFees += cumulatedFees;\n\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\n usableUnderlyings -= cumulatedWithdrawnAmount;\n\n // Decrease total amount queued by the cumulated amount requested\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\n\n // Update new queue cursor\n withdrawalQueueCursor = nextRequestId;\n\n // Retention rate cannot exceeds as the withdrawal decreases both usable\n // underlyings and expected retained amounts by the same number and as the\n // expected retained amount is a subset of usable underlyings amount.\n }\n\n /**\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\n * the retention rate).\n * @dev In contrast to non-big requests processing, this function will uses to fund\n * wallet's balance to fill the request. This allows processing requests that are\n * greater than retention rate without having to exceed this rate on the contract.\n * @param requestId The ID of the big request to process.\n */\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure the request is active\n require(request.account != address(0), \"L66\");\n\n // Ensure the request emitter has not been blacklisted since request emission\n require(!isBlacklisted(request.account), \"L50\");\n\n // Ensure this is indeed a big request\n require(request.amount > getExpectedRetained() / 2, \"L51\");\n\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\n uint256 fundBalance = underlying().balanceOf(fund);\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \"L52\");\n\n // Increase amount of unclaimed fees accordingly\n unclaimedFees += fees;\n\n // Decrease total queued amount by request amount\n totalQueued -= request.amount;\n\n // Increment queue cursor if request was the next request to be processed\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[requestId];\n\n // If fund wallet's balance can cover request, rely on it only\n if (withdrawnAmount <= fundBalance) {\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\n }\n // Else, cover request from both fund wallet and contract balances\n else {\n // Compute amount missing from fund wallet to cover request\n uint256 missingAmount = withdrawnAmount - fundBalance;\n\n // Decrease usable amount of underlying tokens accordingly\n usableUnderlyings -= missingAmount;\n\n // Transfer entire fund balance to request's emitter\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\n\n // Transfer missing amount from contract balance to request emitter\n underlying().safeTransfer(request.account, missingAmount);\n }\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Cancels a given withdrawal request. The request emitter receive back its\n * L-Tokens and no fees will be charged.\n * @param requestId The ID of the withdrawal request to cancel.\n */\n function cancelWithdrawalRequest(\n uint256 requestId\n ) public whenNotPaused notBlacklisted(_msgSender()) {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure request belongs to caller\n require(_msgSender() == request.account, \"L57\");\n\n // Decrease total amount queued accordingly\n totalQueued -= request.amount;\n\n // Delete the withdrawal request from queue\n delete withdrawalQueue[requestId];\n\n // Inform listeners of this cancelled withdrawal request activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Cancelled,\n NO_ID\n );\n\n // Mint back L-Tokens to account\n _mint(request.account, uint256(request.amount));\n }\n\n /**\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\n * whenever those are required to fulfill some withdrawal requests.\n * @dev The function will revert if repatriated amount makes the contract exceeding\n * the retention rate.\n * @param amount The amount of underlying tokens to repatriate.\n */\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\n // Ensure the fund wallet has enough funds to repatriate\n require(amount <= underlying().balanceOf(fund), \"L58\");\n\n // Calculate new contract usable balance\n uint256 newBalance = usableUnderlyings + amount;\n\n // Ensure the new balance doesn't exceed the retention rate\n require(newBalance <= getExpectedRetained(), \"L59\");\n\n // Increase usable underlyings amount by repatriated amount\n usableUnderlyings += amount;\n\n // Transfer amount from fund wallet to contract\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\n }\n\n /// @notice Used by owner to claim fees generated from successful withdrawals.\n function claimFees() external onlyOwner {\n // Ensure there are some fees to claim\n require(unclaimedFees > 0, \"L60\");\n\n // Ensure the contract holds enough underlying tokens to cover fees\n require(usableUnderlyings >= unclaimedFees, \"L61\");\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= unclaimedFees;\n\n // Store fees amount in memory and reset unclaimed fees amount\n uint256 fees = unclaimedFees;\n unclaimedFees = 0;\n\n // Transfer unclaimed fees to owner\n underlying().safeTransfer(owner(), fees);\n }\n}\n" - }, - "contracts/src/LTokenSignaler.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title LTokenSignaler\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\n * signaled, a L-Token will start being indexed.\n *\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\n * @param lTokenAddress The address of the L-Token contract to signal.\n */\n event LTokenSignalEvent(address indexed lTokenAddress);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\n * @param lTokenAddress The address of the LToken contract to signal.\n */\n function signalLToken(address lTokenAddress) external onlyOwner {\n // Signal the LToken contract\n emit LTokenSignalEvent(lTokenAddress);\n }\n}\n" - }, - "contracts/src/PreMining.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LToken} from \"./LToken.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/security/Pausable.sol\";\n\n/**\n * @title PreMining\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n\n * @notice PreMining pool contract, allowing accounts to lock underlying tokens in a \n * pre-defined L-Token contract, over a given duration (in months), in exchange of \n * vested LDY rewards.\n * \n * @dev Intuition\n * \n * Lifecycle of a lockdrop pool is composed by 3 main phases:\n * 1) Deposit: During this phase, users can lock their underlying tokens.\n * 2) Claim: During this phase, users can claim their LDY rewards.\n * 3) Recovery: During this phase, owner can recover remaining ERC20 on the contract.\n * \n * Transitioning between two phases is manually triggered by contract's owner.\n * To ensure fair usage of this power and prevent potential misuse:\n * - the Recovery phase cannot start before 3 months after the end of rewards vesting,\n * - the Recovery phase cannot start before 3 months after the maximum lock end.\n * \n * Finally, note that this contract proxies main L-Token contract's functions:\n * - lock() --> deposit()\n * - instantUnlock() --> instantWithdrawal()\n * - requestUnlock() --> requestWithdrawal()\n * This design enables users to interact with the PreMining contract in a similar fashion\n * to the L-Token contract.\n * \n * @dev Definitions:\n * - Locker: An account that has locked underlying tokens in the pool.\n * \n * @custom:security-contact security@ledgity.com\n */\ncontract PreMining is Ownable2Step, Pausable {\n using SafeERC20 for IERC20;\n\n /**\n * @notice Represents the lock information of an account.\n * @param amount Amount of underlying tokens locked.\n * @param duration Duration of the lock (in months).\n * @param hasUnlocked Whether the account has unlocked its locked tokens.\n * @param claimedRewards Amount of LDY rewards already claimed.\n * @param lockEndTimestamp Timestamp at which the account's lock ends.\n */\n struct AccountLock {\n uint240 amount;\n uint8 duration;\n bool hasUnlocked;\n uint216 claimedRewards;\n uint40 lockEndTimestamp;\n }\n\n /// @notice Holds the amount of LDY to be distributed to lockers.\n uint256 public immutable maxDistributedLDY;\n\n /// @notice Holds the maximum total amount of L-Tokens that can be locked.\n uint256 public immutable lockedHardCap;\n\n /// @notice Holds the minimum possible lock duration (in months).\n uint8 public immutable minLockDuration;\n\n /// @notice Holds the maximum possible lock duration (in months).\n uint8 public immutable maxLockDuration;\n\n /// @notice Holds the duration of LDY rewards vesting (in months).\n uint8 public immutable vestingDuration;\n\n /// @notice Holds a reference to the locked L-Token contract.\n LToken public immutable lToken;\n\n /// @notice Holds a reference to the L-Token underlying stablecoin.\n IERC20 public immutable underlyingToken;\n\n /// @notice Holds the max pool weight.\n uint256 public immutable maxWeight;\n\n /// @notice Holds a reference to the LDY token contract.\n IERC20 public ldyToken;\n\n /// @notice Holds lockers' participations informations.\n mapping(address => AccountLock) public accountsLocks;\n\n /// @notice Holds the total amount of locked underlying tokens.\n uint256 public totalLocked;\n\n /// @notice Holds whether the Deposit phase has ended.\n bool public hasDepositPhaseEnded;\n\n /// @notice Holds whether the Claim phase has started.\n bool public hasClaimPhaseStarted;\n\n /// @notice Holds whether the Recovery phase has started.\n bool public hasRecoveryPhaseStarted;\n\n /// @notice Holds the timestamp at which the Claim phase started.\n uint256 public claimPhaseStartTimestamp;\n\n /// @notice Holds an ordered queue of accounts that requested to unlock their tokens.\n address[] public unlockRequests;\n\n /// @notice Holds the index of the first request in the queue (a.k.a, next one to be processed).\n uint256 public unlockRequestsCursor;\n\n /// @notice Emitted to inform about a new lock/deposit.\n event Lock(address indexed account, uint256 amount, uint8 duration);\n\n /// @notice Top-level checks and code shared by both unlock functions.\n modifier safeUnlock() {\n // Ensure that the account's lock has ended\n require(accountsLocks[msg.sender].lockEndTimestamp <= block.timestamp, \"L68\");\n\n // Ensure the account hasn't already unlocked its tokens\n require(!accountsLocks[msg.sender].hasUnlocked, \"L69\");\n\n // Ensure the account has something to unlock\n require(accountsLocks[msg.sender].amount > 0, \"L70\");\n\n // Indicate that account has unlocked its tokens\n accountsLocks[msg.sender].hasUnlocked = true;\n _;\n }\n\n /**\n * @notice This constructor function etches the lockdrop terms in immutable states.\n * Ensuring that those terms cannot be modified after deployment.\n * @param lTokenAddress_ Address of the L-Token contract to use.\n * @param maxDistributedLDY_ Amount of LDY to be distributed to lockers.\n * @param lockedHardCap_ Maximum total amount of L-Tokens that can be locked.\n * @param minLockDuration_ Minimum possible lock duration (in months).\n * @param maxLockDuration_ Maximum possible lock duration (in months).\n * @param vestingDuration_ Duration of LDY rewards vesting (in months).\n */\n constructor(\n address lTokenAddress_,\n uint256 maxDistributedLDY_,\n uint256 lockedHardCap_,\n uint8 minLockDuration_,\n uint8 maxLockDuration_,\n uint8 vestingDuration_\n ) {\n // Ensure minLockDuration is at least 1 month\n require(minLockDuration_ >= 1, \"L72\");\n\n // Ensure minLockDuration is not greater than maxLockDuration\n require(minLockDuration_ <= maxLockDuration_, \"L73\");\n\n // Set immutable states\n lToken = LToken(lTokenAddress_);\n underlyingToken = IERC20(address(lToken.underlying()));\n lockedHardCap = lockedHardCap_;\n maxDistributedLDY = maxDistributedLDY_;\n minLockDuration = minLockDuration_;\n maxLockDuration = maxLockDuration_;\n vestingDuration = vestingDuration_;\n maxWeight = lockedHardCap * uint256(maxLockDuration);\n }\n\n /**\n * @notice Public implementation of Pausable's pausing and unpausing functions, but\n * restricted to contract's owner.\n */\n function pause() public onlyOwner {\n _pause();\n }\n\n function unpause() public onlyOwner {\n _unpause();\n }\n\n /**\n * @notice Updates the LDY token contract address.\n * @dev As the first Ledgity Yield lockdrop campaigns will start before the LDY TGE,\n * this function allows the contract's owner to set the LDY token address once it\n * becomes available.\n * @param ldyTokenAddress Address of the LDY token contract.\n */\n function setLDYToken(address ldyTokenAddress) external onlyOwner {\n // Prevent owner from changing the LDY address after Claim phase has started\n require(!hasClaimPhaseStarted, \"L74\");\n\n // Set LDY token address\n ldyToken = IERC20(ldyTokenAddress);\n }\n\n /**\n * @notice Closes the Deposit phase. After calling this function, account won't be\n * able to lock additional underlying tokens anymore.\n */\n function endDepositPhase() external onlyOwner {\n hasDepositPhaseEnded = true;\n }\n\n /**\n * @notice Opens the Claim phase. After calling this function, lockers will be able\n * to start claiming their LDY rewards.\n */\n function startClaimPhase() external onlyOwner {\n // Ensure Claim phase has not already started\n require(!hasClaimPhaseStarted, \"L76\");\n\n // Ensure that LDY token address is available\n require(address(ldyToken) != address(0), \"L77\");\n\n // Set Claim phase as started and store the start timestamp\n hasClaimPhaseStarted = true;\n claimPhaseStartTimestamp = block.timestamp;\n }\n\n /**\n * @notice Opens the Recovery phase. After calling this function, the contract owner\n * will be able to recover remaining ERC20 tokens on the contract.\n * Note that this won't close the Claim phase and lockers will still be able to claim\n * their LDY rewards.\n */\n function startRecoveryPhase() external onlyOwner {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L79\");\n\n // Compute some durations in seconds\n uint256 threeMonthsInSecond = 3 * 30 days;\n uint256 vestingInSecond = uint256(vestingDuration) * 30 days;\n uint256 maxLockInSecond = uint256(maxLockDuration) * 30 days;\n\n // Compute timestamp of vesting end + 3 months\n uint256 afterVestingTimestamp = claimPhaseStartTimestamp +\n vestingInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the end of reward vesting\n // This prevents owner from recovering LDY before lockers can claim their rewards\n require(block.timestamp >= afterVestingTimestamp, \"L80\");\n\n // Compute end of maximum lock + 3 months\n // Note that claimPhaseStartTimestamp is used for simplicity even if it can exist a time\n // span between Deposit and Claim phases.\n uint256 afterMaxLockTimestamp = claimPhaseStartTimestamp +\n maxLockInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the maximum lock end\n // This prevents owner from recovering underlying tokens before lockers can unlock those\n require(block.timestamp >= afterMaxLockTimestamp, \"L81\");\n\n // Set recovery phase as started\n hasRecoveryPhaseStarted = true;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address. Will revert if\n * recovery phase has not started yet or if the contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) external onlyOwner {\n // Ensure recovery phase has started\n require(hasRecoveryPhaseStarted, \"L82\");\n\n // Create a reference to token's contract\n IERC20 tokenContract = IERC20(tokenAddress);\n\n // Ensure there is enough tokens to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L83\");\n\n // Transfer the recovered token amount to the sender (owner)\n tokenContract.safeTransfer(msg.sender, amount);\n }\n\n /**\n * @notice Compute the total amount of LDY rewards that a given account is eligible to.\n * @dev Note: This function neither considers vesting nor already claimed rewards.\n * @param account The account to compute the eligible rewards of.\n * @return The total amount of LDY rewards that the account is eligible to.\n */\n function eligibleRewardsOf(address account) public view returns (uint256) {\n // Compute account's lock weight\n uint256 lockerWeight = accountsLocks[account].amount * accountsLocks[account].duration;\n\n // Compute amount of LDY that this locker is eligible to\n if (maxWeight == 0) return 0;\n else return (maxDistributedLDY * lockerWeight) / maxWeight;\n }\n\n /**\n * @notice Allows locking a specified amount of underlying tokens for a given duration.\n * By locking, an account became eligible to a portion of the distributed LDY rewards.\n * @dev This function proxies LToken.deposit()\n * @dev Lockers can extend their lock duration by calling this function again with a\n * greater duration and 0 as amount.\n * @param amount Amount of underlying tokens to lock.\n * @param duration Duration of the lock (in months).\n */\n function lock(uint256 amount, uint8 duration) external whenNotPaused {\n // Ensure Deposit phase has not ended yet\n require(!hasDepositPhaseEnded, \"L84\");\n\n // Ensure account hasn't already unlocked a past lock\n require(!accountsLocks[msg.sender].hasUnlocked, \"L71\");\n\n // Ensure lock duration is in valid range\n require(duration >= minLockDuration && duration <= maxLockDuration, \"L85\");\n\n // Ensure it won't exceed the hardcap\n require(totalLocked + amount <= uint256(lockedHardCap), \"L86\");\n\n // Increase account's locked amount\n accountsLocks[msg.sender].amount += uint240(amount);\n\n // Increase total locked amount accordingly\n totalLocked += amount;\n\n // Use existing lock duration if greater than the new one\n uint8 existingDuration = accountsLocks[msg.sender].duration;\n uint8 appliedDuration = existingDuration > duration ? existingDuration : duration;\n\n // Update account's lock duration\n accountsLocks[msg.sender].duration = appliedDuration;\n\n // Update account's lock end timestamp\n accountsLocks[msg.sender].lockEndTimestamp = uint40(\n block.timestamp + uint40(appliedDuration) * 30 days\n );\n\n // Emit a Lock event\n emit Lock(msg.sender, amount, appliedDuration);\n\n // If amount is 0, skip deposit\n if (amount == 0) return;\n\n // Transfer underlyingToken from account to contract\n underlyingToken.safeTransferFrom(msg.sender, address(this), amount);\n\n // Deposit USDC in the L-Token contract\n underlyingToken.safeApprove(address(lToken), amount);\n lToken.deposit(amount);\n }\n\n /**\n * @notice Allows the caller to instaneously unlock its locked amount of underlying\n * tokens.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestUnlock() function otherwise.\n */\n function instantUnlock() external whenNotPaused safeUnlock {\n // Retrieve underlying tokens from the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.instantWithdrawal(unlockedAmount);\n\n // Transfer underlying tokens back to caller\n underlyingToken.safeTransfer(msg.sender, unlockedAmount);\n }\n\n /**\n * @notice Allows the call to request for the unlocking of its locked amount of\n * underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n */\n function requestUnlock() external payable whenNotPaused safeUnlock {\n // Put account in the unlock requests queue\n unlockRequests.push(msg.sender);\n\n // Request underlying tokens to the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.requestWithdrawal{value: msg.value}(unlockedAmount);\n }\n\n /**\n * @notice Processes queued unlock requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n */\n function processUnlockRequests() external onlyOwner {\n // Store the current request ID to process\n uint256 processedId = unlockRequestsCursor;\n\n // Loop over remaining requests\n while (processedId < unlockRequests.length) {\n // Prevent OOG by stopping request processing if there is not enough gas left\n // to continue the loop and properly end the function call.\n if (gasleft() < 45000) break;\n\n // Retrieve the request account\n address unlockAccount = unlockRequests[processedId];\n\n // Retrieve the unlocked amount\n uint256 unlockAmount = accountsLocks[unlockAccount].amount;\n\n // If the request has already been processed, skip it\n if (unlockAccount != address(0)) {\n // If the contract doesn't hold enough underlying tokens to process the request, stop here\n if (underlyingToken.balanceOf(address(this)) < unlockAmount) break;\n\n // Delete the request\n delete unlockRequests[processedId];\n\n // Transfer underlying back to account\n underlyingToken.safeTransfer(unlockAccount, unlockAmount);\n }\n\n // Increment processed request ID\n processedId++;\n }\n\n // Write back the cursor in storage\n unlockRequestsCursor = processedId;\n }\n\n /**\n * @notice Computes the amount of LDY rewards available to claim for a given account.\n * @dev This function considers vesting and already claimed rewards.\n * @param account The account to compute the available rewards of.\n * @return The amount of LDY rewards available to claim.\n */\n function availableToClaim(address account) public view returns (uint256) {\n // Compute total amount of rewards allocated to this locker\n uint256 totalEligibleRewards = eligibleRewardsOf(account);\n\n // Compute vesting duration in seconds\n uint256 vestingInSeconds = uint256(vestingDuration) * 30 days;\n\n // Compute elapsed months since claim phase started, and cap it to vesting duration\n uint256 elapsedTime = block.timestamp - claimPhaseStartTimestamp;\n if (elapsedTime > vestingInSeconds) elapsedTime = vestingInSeconds;\n\n // Compute total available to claim (proportionally to elapsed time)\n uint256 totalAvailableToClaim = (totalEligibleRewards * elapsedTime) / vestingInSeconds;\n\n // Else return net claimable (available minus already claimed)\n return totalAvailableToClaim - accountsLocks[account].claimedRewards;\n }\n\n /// @notice Allows the caller to claim its available LDY rewards.\n function claimRewards() external whenNotPaused {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L87\");\n\n // Compute claimable LDY rewards\n uint256 claimableLDY = availableToClaim(msg.sender);\n\n // Increase account claimed amount accordingly\n accountsLocks[msg.sender].claimedRewards += uint216(claimableLDY);\n\n // Transfer rewards to account\n ldyToken.safeTransfer(msg.sender, claimableLDY);\n }\n}\n" - } - }, - "settings": { - "evmVersion": "london", - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/contracts/hardhat/deployments/localhost/solcInputs/a268142553104e6d2a73dbd3773cf551.json b/contracts/hardhat/deployments/localhost/solcInputs/616c2bbfbbb38e0f66e1812240dc44b0.json similarity index 92% rename from contracts/hardhat/deployments/localhost/solcInputs/a268142553104e6d2a73dbd3773cf551.json rename to contracts/hardhat/deployments/localhost/solcInputs/616c2bbfbbb38e0f66e1812240dc44b0.json index e624963b..27f11f2e 100644 --- a/contracts/hardhat/deployments/localhost/solcInputs/a268142553104e6d2a73dbd3773cf551.json +++ b/contracts/hardhat/deployments/localhost/solcInputs/616c2bbfbbb38e0f66e1812240dc44b0.json @@ -67,6 +67,15 @@ "@openzeppelin/contracts/security/Pausable.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n constructor() {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" }, + "@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" + }, + "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC20.sol\";\nimport \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n /**\n * @dev Destroys `amount` tokens from the caller.\n *\n * See {ERC20-_burn}.\n */\n function burn(uint256 amount) public virtual {\n _burn(_msgSender(), amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, deducting from the caller's\n * allowance.\n *\n * See {ERC20-_burn} and {ERC20-allowance}.\n *\n * Requirements:\n *\n * - the caller must have allowance for ``accounts``'s tokens of at least\n * `amount`.\n */\n function burnFrom(address account, uint256 amount) public virtual {\n _spendAllowance(account, _msgSender(), amount);\n _burn(account, amount);\n }\n}\n" + }, + "@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" + }, "@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" }, @@ -106,6 +115,9 @@ "contracts/src/DummyLDYStaking.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\n/**\n * @title LDYStaking\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice This contract acts as a placeholder for the real LDYStaking contract until\n * this one is deployed.\n *\n * @dev This contract only implements tierOf() function from LDYStaking as it's the only\n * one the LToken contract relies on.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LDYStaking is Ownable2Step {\n /**\n * @notice Holds a mapping of addresses that default to the highest staking tier.\n * @dev This is notably used to allow PreMining contracts to benefit from 0%\n * withdrawal fees in L-Tokens contracts, when accounts unlock their funds.\n */\n mapping(address => bool) public highTierAccounts;\n\n /**\n * @notice Update high tier status of a given account.\n * @param account The account to update the high tier status of.\n */\n function setHighTierAccount(address account, bool status) public onlyOwner {\n highTierAccounts[account] = status;\n }\n\n /**\n * @dev Dummy tierOf() function that always return that the given account is not\n * elligible to any LDY staking tier, except if the account is in the\n * highTierAccounts mapping.\n * @param account The account to check the tier of.\n */\n function tierOf(address account) public view returns (uint256 tier) {\n if (highTierAccounts[account]) return 3;\n return 0;\n }\n}\n" }, + "contracts/src/GenericERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {ERC20Burnable} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\n\n/**\n * @notice Used for testing purposes only, and used to generate ABIs for Wagmi contracts calls.\n * It represents:\n * - a FIAT-based stablecoin when used to test the LToken contract,\n * - the $LDY token when used to test the LDYStaking contract.\n * This contract accept decimals as constructor argument, so it can be used to to\n * easily test different decimals scenarios.\n */\ncontract GenericERC20 is ERC20, ERC20Burnable {\n uint8 private _decimals;\n\n constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) {\n _decimals = decimals_;\n }\n\n function mint(uint256 amount) public {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n /**\n * Used in tests to test different decimals scenarios.\n */\n function setDecimals(uint8 decimals_) public {\n _decimals = decimals_;\n }\n}\n" + }, "contracts/src/GlobalBlacklist.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title GlobalBlacklist\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Holds a global mapping of blacklisted accounts shared by all contracts of the\n * Ledgity Yield codebase.\n *\n * @dev Specifically, some contracts within the codebase inherit from the\n * GlobalRestrictableUpgradeable abstract contract. This provides them with modifiers\n * and getter functions to easily check against this global blacklist.\n *\n * @dev For further details, see \"GlobalBlacklist\" section of whitepaper.\n * @custom:security-contact security@ledgity.com\n */\ncontract GlobalBlacklist is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Mapping of accounts to their blacklist status.\n * @dev This mapping is made private and isBlacklisted() should be used instead.This\n * helps saving gas in some scenario. See isBlacklisted() documentation for more details.\n */\n mapping(address => bool) private _list;\n\n /// @dev Emitted when `account` is blacklisted.\n event Blacklisted(address account);\n\n /// @dev Emitted when `account` is unblacklisted.\n event Unblacklisted(address account);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Adds a given account to the blacklist.\n * @param account The account's address to be blacklisted.\n */\n function blacklist(address account) external onlyOwner {\n require(account != address(0), \"L20\");\n _list[account] = true;\n emit Blacklisted(account);\n }\n\n /**\n * @notice Removes a given account from the blacklist.\n * @param account The account's address to be un-blacklisted.\n */\n function unBlacklist(address account) external onlyOwner {\n _list[account] = false;\n emit Unblacklisted(account);\n }\n\n /**\n * @notice Checks whether a given account is blacklisted.\n * @param account Address of the account to check.\n * @return 'true' if the account is blacklisted, 'false' otherwise\n */\n function isBlacklisted(address account) external view returns (bool) {\n // Gas optimization: Avoid accessing storage if account is the zero address\n // (e.g, during a mint or a burn of tokens)\n if (account == address(0)) return false;\n\n // Else, return current account's blacklist status\n return _list[account];\n }\n}\n" }, @@ -127,12 +139,14 @@ "contracts/src/LToken.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\n// Contracts\nimport {ERC20WrapperUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol\";\nimport \"./abstracts/base/ERC20BaseUpgradeable.sol\";\nimport {InvestUpgradeable} from \"./abstracts/InvestUpgradeable.sol\";\nimport {LDYStaking} from \"./DummyLDYStaking.sol\";\n\n// Libraries\nimport {SafeERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport {SUD} from \"./libs/SUD.sol\";\n\n// Interfaces\nimport {IERC20Upgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport {IERC20MetadataUpgradeable} from \"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\";\nimport {ITransfersListener} from \"./interfaces/ITransfersListener.sol\";\n\n/**\n * @title LToken\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Main contract of the Ledgity Yield protocol. It powers every L-Token (i.e.,\n * investment pools backed by RWA). An L-Token is an ERC20 wrapper around a stablecoin.\n * As soon as a wallet holds some L-Tokens, it starts receiving rewards in\n * the form of additional L-Tokens, which are auto-compounded over time.\n *\n * @dev Definitions:\n * - Deposit: Swap of underlying tokens for L-Tokens (1:1 ratio).\n * - Withdrawal: Swap of L-Tokens for underlying tokens (1:1 ratio, minus applicable fees).\n * - Instant: Processed immediately.\n * - Request: Queued for later processing.\n * - Big Request: A requested withdrawal exceeding half of the retention rate.\n * - (Withdrawal) queue: A list of all requested withdrawals sorted by priority.\n * - Request ID: The index of a withdrawal request in the queue array.\n * - Retention rate: Maximum fraction of underlying tokens TVL the contract can retain.\n * - Fees Rate: Percentage of fees applied to successful withdrawals.\n * - Usable underlyings: Amount of underlying tokens that have been deposited through\n * expected ways and are so considered safe to use by the contract.\n * - Transfers listeners: External contracts listening on L-Tokens transfers.\n * - Fund wallet: Wallet managed by the Ledgity's financial team.\n * - Withdrawer wallet: Managed by an off-chain server to automate withdrawal request\n * processing.\n *\n * Note that words between parenthesis are sometimes omitted for brevity.\n *\n * @dev Deployment notice:\n * This contract can safely receive funds immediately after initialization. (i.e., there\n * is no way for funds to be sent to non-owned addresses). It is, however, recommended to\n * replace ASAP owner and fund wallets with multi-sig wallets.\n *\n * @dev For further details, see \"LToken\" section of whitepaper.\n * @custom:oz-upgrades-unsafe-allow external-library-linking\n * @custom:security-contact security@ledgity.com\n */\ncontract LToken is ERC20BaseUpgradeable, InvestUpgradeable, ERC20WrapperUpgradeable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n /// @dev Represents type of actions triggering ActivityEvent events.\n enum Action {\n Deposit,\n Withdraw\n }\n\n /// @dev Represents different status of actions triggering ActivityEvent events.\n enum Status {\n Queued,\n Cancelled,\n Success,\n Moved\n }\n\n /**\n * @notice Represents a withdrawal request in the queue.\n * @dev A request fits in a single storage slot (32 bytes).\n * @param account The account that initiated the request.\n * @param amount The amount of underlying tokens requested.\n */\n struct WithdrawalRequest {\n address account; // 20 bytes\n uint96 amount; // 12 bytes\n }\n\n /// @notice Upper limit of retention rate.\n uint32 private constant MAX_RETENTION_RATE_UD7x3 = 10 * 10 ** 3; // 10%\n\n /// @notice Upper limit of fees rate.\n uint32 private constant MAX_FEES_RATE_UD7x3 = 20 * 10 ** 3; // 20%\n\n /// @notice Used in activity events to represent the absence of request ID.\n int256 private constant NO_ID = -1;\n\n /// @notice Holds a reference to the LDYStaking contract.\n LDYStaking public ldyStaking;\n\n /// @notice Holds address of withdrawer wallet (managed by withdrawal server).\n address payable public withdrawer;\n\n /// @notice Holds address of fund wallet (managed by Ledgity financial team).\n address public fund;\n\n /// @notice Holds the withdrawal fees rate in UD7x3 format (e.g., 350 = 0.350%).\n uint32 public feesRateUD7x3;\n\n /// @notice Holds the retention rate in UD7x3 format.\n uint32 public retentionRateUD7x3;\n\n /// @notice Holds the amount of withdrawal fees not yet claimed by contract's owner.\n uint256 public unclaimedFees;\n\n /// @notice Holds the amount of L-Tokens currently in the withdrawal queue.\n uint256 public totalQueued;\n\n /**\n * @notice Holds the amount of underlying tokens considered as usable by the contract.\n * @dev Are usable, only underlying tokens deposit through deposit() or fund() functions.\n */\n uint256 public usableUnderlyings;\n\n /// @notice Holds an ordered list of active withdrawal requests.\n WithdrawalRequest[] public withdrawalQueue;\n\n /// @notice Holds the index of the next withdrawal request to process in the queue.\n uint256 public withdrawalQueueCursor;\n\n /**\n * @notice Holds a list of all currently frozen withdrawal requests.\n * @dev If a request emitter as been blacklisted, its request is moved here to prevent\n * it from blocking the queue.\n */\n WithdrawalRequest[] public frozenRequests;\n\n /**\n * @notice Holds a list of contracts' references that are listening to L-Tokens transfers.\n * @dev onLTokenTransfer() functions of those contracts will be called on each transfer.\n */\n ITransfersListener[] public transfersListeners;\n\n /**\n * @notice Emitted to inform listeners about a change in the contract's TVL.\n * @dev TVL = realTotalSupply()\n * @param newTVL The new TVL of the contract.\n */\n event TVLChangeEvent(uint256 newTVL);\n\n /**\n * @notice Emitted to inform listerners about an activity related to deposits and withdrawals.\n * @param id ID of the involved withdrawal request or NO_ID (-1) if not applicable.\n * @param account The account involved in the activity.\n * @param action The type of activity.\n * @param amount The amount of underlying tokens involved in the activity.\n * @param newStatus The new status of the activity.\n * @param newId The new ID of the request if it has been moved in the queue.\n */\n event ActivityEvent(\n int256 indexed id,\n address indexed account,\n Action indexed action,\n uint256 amount,\n uint256 amountAfterFees,\n Status newStatus,\n int256 newId\n );\n\n /**\n * @notice Emitted to inform listeners that some rewards have been minted.\n * @param account The account that received the rewards.\n * @param balanceBefore The balance of the account before the minting.\n * @param rewards The amount of minted rewards.\n */\n event MintedRewardsEvent(address indexed account, uint256 balanceBefore, uint256 rewards);\n\n /// @notice Reverts if the function caller is not the withdrawer wallet.\n modifier onlyWithdrawer() {\n require(_msgSender() == withdrawer, \"L39\");\n _;\n }\n\n /// @notice Reverts if the function caller is not the fund wallet.\n modifier onlyFund() {\n require(_msgSender() == fund, \"L40\");\n _;\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n * @param globalOwner_ The address of the GlobalOwner contract.\n * @param globalPause_ The address of the GlobalPause contract.\n * @param globalBlacklist_ The address of the GlobalBlacklist contract.\n * @param underlyingToken The address of the underlying stablecoin ERC20 token.\n */\n function initialize(\n address globalOwner_,\n address globalPause_,\n address globalBlacklist_,\n address ldyStaking_,\n address underlyingToken\n ) public initializer {\n // Initialize ERC20 base.\n string memory underlyingSymbol = IERC20MetadataUpgradeable(underlyingToken).symbol();\n __ERC20Base_init(\n globalOwner_,\n globalPause_,\n globalBlacklist_,\n string(abi.encodePacked(\"Ledgity \", underlyingSymbol)),\n string(abi.encodePacked(\"L\", underlyingSymbol))\n );\n\n // IMPORTANT: Below calls must not be restricted to owner at any point.\n // This is because the GlobalOwner contract may not be a fresh one, and so\n // the contract deployer may not be the owner anymore after ERC20Base init.\n\n // Initialize other parents contracts.\n __ERC20Wrapper_init(IERC20Upgradeable(underlyingToken));\n __Invest_init_unchained(address(this));\n\n // Set LDYStaking contract\n ldyStaking = LDYStaking(ldyStaking_);\n\n // Set initial withdrawal fees rate to 0.3%\n feesRateUD7x3 = 300;\n\n // Set initial retention rate to 10%\n retentionRateUD7x3 = 10_000;\n\n // Default withdrawer and fund wallet to contract owner address. This prevents\n // any loss of funds if a deposit/withdrawal is made before those are manually set.\n withdrawer = payable(owner());\n fund = payable(owner());\n }\n\n /**\n * @notice Required override of decimals() which is implemented by both\n * ERC20Upgradeable and ERC20WrapperUpgradeable parent contracts.\n * @dev The ERC20WrapperUpgradeable version is preferred because it mirrors the\n * decimals amount of the underlying stablecoin token.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function decimals()\n public\n view\n override(ERC20Upgradeable, ERC20WrapperUpgradeable)\n returns (uint8)\n {\n return ERC20WrapperUpgradeable.decimals();\n }\n\n /**\n * @notice Required override of paused() which is implemented by both\n * GlobalPausableUpgradeable and ERC20BaseUpgradeable parent contracts.\n * @dev Both version are the same as ERC20BaseUpgradeable.paused() mirrors\n * GlobalPausableUpgradeable.paused(), so a random one is chosen.\n * @inheritdoc GlobalPausableUpgradeable\n */\n function paused()\n public\n view\n virtual\n override(GlobalPausableUpgradeable, ERC20BaseUpgradeable)\n returns (bool)\n {\n return GlobalPausableUpgradeable.paused();\n }\n\n /**\n * @notice Updates the current withdrawal fee rate.\n * @param feesRateUD7x3_ The new withdrawal fee rate in UD7x3 format.\n */\n function setFeesRate(uint32 feesRateUD7x3_) public onlyOwner {\n require(feesRateUD7x3_ <= MAX_FEES_RATE_UD7x3, \"L88\");\n feesRateUD7x3 = feesRateUD7x3_;\n }\n\n /**\n * @notice Updates the current underlying token retention rate.\n * @dev The retention rate is capped at 10%, which ensures that no more than 10% of\n * deposited assets will ever be exposed in this contract (reduces attack surface).\n * @param retentionRateUD7x3_ The new retention rate in UD7x3 format.\n */\n function setRetentionRate(uint32 retentionRateUD7x3_) public onlyOwner {\n require(retentionRateUD7x3_ <= MAX_RETENTION_RATE_UD7x3, \"L41\");\n retentionRateUD7x3 = retentionRateUD7x3_;\n }\n\n /**\n * @notice Updates the address of LDYStaking contract.\n * @param ldyStakingAddress The address of the new LDYStaking contract.\n */\n function setLDYStaking(address ldyStakingAddress) public onlyOwner {\n ldyStaking = LDYStaking(ldyStakingAddress);\n }\n\n /**\n * @notice Updates the address of the withdrawer wallet.\n * @param withdrawer_ The address of the new withdrawer wallet.\n */\n function setWithdrawer(address payable withdrawer_) public onlyOwner {\n // Ensure address is not the zero address (pre-processing fees would be lost else)\n require(withdrawer_ != address(0), \"L63\");\n\n // Set new withdrawer wallet's address\n withdrawer = withdrawer_;\n }\n\n /**\n * @notice Updates the address of the fund wallet.\n * @param fund_ The address of the new fund wallet.\n */\n function setFund(address payable fund_) public onlyOwner {\n // Ensure address is not the zero address (deposited tokens would be lost else)\n require(fund_ != address(0), \"L64\");\n\n // Set new fund wallet's address\n fund = fund_;\n }\n\n /**\n * @notice Adds a new contract to the L-Token transfers list.\n * @dev Each time a transfer occurs, the onLTokenTransfer() function of the\n * specified contract will be called.\n * @dev IMPORTANT SECURITY NOTE: This method is not intended to be used with\n * contracts that are not owned by the Ledgity team.\n * @param listenerContract The address of the new transfers listener contract.\n */\n function listenToTransfers(address listenerContract) public onlyOwner {\n transfersListeners.push(ITransfersListener(listenerContract));\n }\n\n /**\n * @notice Removes a contract from the L-Token transfers list.\n * @dev The onLTokenTransfer() function of the specified contract will not be called\n * anymore each time a L-Token transfer occurs.\n * @param listenerContract The address of the listener contract.\n */\n function unlistenToTransfers(address listenerContract) public onlyOwner {\n // Find index of listener contract in transferListeners array\n int256 index = -1;\n uint256 transfersListenersLength = transfersListeners.length;\n for (uint256 i = 0; i < transfersListenersLength; i++) {\n if (address(transfersListeners[i]) == listenerContract) {\n index = int256(i);\n break;\n }\n }\n\n // Revert if given contract wasn't listening to transfers\n require(index > -1, \"L42\");\n\n // Else, remove transfers listener contract from listeners array\n transfersListeners[uint256(index)] = transfersListeners[transfersListenersLength - 1];\n transfersListeners.pop();\n }\n\n /**\n * @notice Retrieves the amount of given account's not yet minted rewards.\n * @dev This is a public implementation of InvestUpgradeable_rewardsOf(). In the\n * context of LToken, this function returns the amount of rewards that have not been\n * distributed/minted yet to the specified account.\n * @dev This is particularly useful for off-chain services to display charts and\n * statistics, as seen in the Ledgity Yield's frontend.\n * @param account The account to check the unminted rewards of.\n * @return The amount of account's unminted rewards.\n */\n function unmintedRewardsOf(address account) public view returns (uint256) {\n return _rewardsOf(account, true);\n }\n\n /**\n * @notice Retrieves the \"real\" balance of an account, i.e., excluding its not yet\n * minted/distributed rewards.\n * @param account The account to check the real balance of.\n * @return The real balance of the account.\n */\n function realBalanceOf(address account) public view returns (uint256) {\n return super.balanceOf(account);\n }\n\n /**\n * @notice Retrieves the total balance of L-Tokens that belong to the account.\n * @dev This is an oOverride of ERC20Upgradeable.balanceOf() that rewards that have\n * not been yet minted to the specified account.\n * @param account The account to check the total balance of.\n * @return The total balance of the account.\n */\n function balanceOf(address account) public view override returns (uint256) {\n return realBalanceOf(account) + unmintedRewardsOf(account);\n }\n\n /**\n * @notice Returns the \"real\" amount of existing L-Tokens, i.e., excluding not yet\n * minted withdrawal fees and L-Tokens currently in the withdrawal queue.\n * @return The real total supply of L-Tokens.\n */\n function realTotalSupply() public view returns (uint256) {\n return super.totalSupply();\n }\n\n /**\n * @notice Retrives the total supply of L-Tokens, including not yet minted withdrawal\n * fees and L-Tokens currently in the withdrawal queue.\n * @return The total supply of L-Tokens.\n */\n function totalSupply() public view override returns (uint256) {\n return realTotalSupply() + totalQueued + unclaimedFees;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address.\n * @dev This override of RecoverableUpgradeable.recoverERC20() prevents the recovered\n * token from being the underlying token.\n * @inheritdoc RecoverableUpgradeable\n */\n function recoverERC20(address tokenAddress, uint256 amount) public override onlyOwner {\n // Ensure the token is not the underlying token\n require(tokenAddress != address(underlying()), \"L43\");\n\n // Proceed to recovery\n super.recoverERC20(tokenAddress, amount);\n }\n\n /**\n * @notice Recovers underlying tokens accidentally sent to the contract.\n * @dev To prevent owner from being able to drain the contract, this function only\n * allows recovering \"unusable\" underlying tokens, i.e., tokens that have not been\n * sent through fund() or deposit() functions.\n */\n function recoverUnderlying() external onlyOwner {\n // Compute the recoverable amount by taking the difference between the contract's\n // balance and the amount of usable underlying tokens\n uint256 recoverableAmount = underlying().balanceOf(address(this)) - usableUnderlyings;\n\n // Revert if there is nothing to recover\n require(recoverableAmount > 0, \"L44\");\n\n // Else, proceed to underlying tokens recovery\n super.recoverERC20(address(underlying()), recoverableAmount);\n }\n\n /**\n * @notice Retrieves the amount of underlying tokens invested by the given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract. In\n * LToken contract, the investment of an account is equal to its real balance.\n * @inheritdoc InvestUpgradeable\n */\n function _investmentOf(address account) internal view override returns (uint256) {\n return realBalanceOf(account);\n }\n\n /**\n * @notice Distributes a specified amount of rewards (in L-Tokens) to a given account.\n * @dev Implementing this function is required by the InvestUpgradeable contract so\n * it can distribute rewards to accounts before each period reset.\n * @dev InvestUpgradeable contract already ensure that amount > 0.\n * @inheritdoc InvestUpgradeable\n */\n function _distributeRewards(address account, uint256 amount) internal override returns (bool) {\n // Inform listeners of the rewards minting\n emit MintedRewardsEvent(account, realBalanceOf(account), amount);\n\n // Mint L-Tokens rewards to account\n _mint(account, amount);\n\n // Return true indicating to InvestUpgradeable that the rewards have been distributed\n return true;\n }\n\n /**\n * @notice Override of ERC20._beforeTokenTransfer() to integrate with InvestUpgradeable.\n * @dev This overriden version ensure that _beforeInvestmentChange() hook is properly\n * called each time an account's balance is going to change.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already included in ERC20BaseUpgradeable._beforeTokenTransfer().\n * @inheritdoc ERC20BaseUpgradeable\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Upgradeable, ERC20BaseUpgradeable) {\n ERC20BaseUpgradeable._beforeTokenTransfer(from, to, amount);\n\n // Invoke _beforeInvestmentChange() hook for non-zero accounts\n if (from != address(0)) _beforeInvestmentChange(from, true);\n if (to != address(0)) _beforeInvestmentChange(to, true);\n }\n\n /**\n * @notice Override of ERC20._afterTokenTransfer() to notify all transfers listeners.\n * @dev This overriden version will trigger onLTokenTransfer() functions of all\n * transfers listeners.\n * @dev Note: whenNotPaused and notBlacklisted modifiers are not set as they are\n * already checked in _beforeTokenTransfer().\n * @inheritdoc ERC20Upgradeable\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal override {\n super._afterTokenTransfer(from, to, amount);\n\n // If some L-Token have been burned/minted, inform listeners of a TVL change\n if (from == address(0) || to == address(0)) emit TVLChangeEvent(totalSupply());\n\n // Trigger onLTokenTransfer() functions of all the transfers listeners\n for (uint256 i = 0; i < transfersListeners.length; i++) {\n transfersListeners[i].onLTokenTransfer(from, to, amount);\n }\n }\n\n /**\n * @notice Computes the maximum amount of underlying tokens that should be retained\n * by the contract (based on retention rate).\n * @return amount The expected amount of retained underlying tokens.\n */\n function getExpectedRetained() public view returns (uint256 amount) {\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert totalSupply and retentionRate to SUD\n uint256 totalSupplySUD = SUD.fromAmount(totalSupply(), d);\n uint256 retentionRateSUD = SUD.fromRate(retentionRateUD7x3, d);\n\n // Compute and return expected retained amount\n uint256 expectedRetainedSUD = (totalSupplySUD * retentionRateSUD) / SUD.fromInt(100, d);\n return SUD.toAmount(expectedRetainedSUD, d);\n }\n\n /// @notice Transfers underlying tokens exceeding the retention rate to the fund wallet.\n function _transferExceedingToFund() internal {\n // Retrieve the expected amount retained\n uint256 expectedRetained = getExpectedRetained();\n\n // If usable underlyings are less than or equal to expected retained, return\n if (usableUnderlyings <= expectedRetained) return;\n\n // Else, exceeding amount is equal to difference between those values\n uint256 exceedingAmount = usableUnderlyings - expectedRetained;\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= exceedingAmount;\n\n // Transfer the exceeding amount to the fund wallet\n underlying().safeTransfer(fund, exceedingAmount);\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.withdrawTo() that reverts.\n * Use instantWithdrawal() or requestWithdrawal() functions instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function withdrawTo(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L45\");\n }\n\n /**\n * @notice Override of ERC20WrapperUpgradeable.depositFor() that reverts.\n * Use deposit() function instead.\n * @inheritdoc ERC20WrapperUpgradeable\n */\n function depositFor(address account, uint256 amount) public pure override returns (bool) {\n account; // Silence unused variable compiler warning\n amount;\n revert(\"L46\");\n }\n\n /**\n * @notice Allows exchanging some underlying tokens for the same amount of L-Tokens.\n * @param amount The amount of underlying tokens to deposit.\n */\n function deposit(uint256 amount) public whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough underlying tokens to deposit\n require(underlying().balanceOf(_msgSender()) >= amount, \"L47\");\n\n // Update usable underlyings balance accordingly\n usableUnderlyings += amount;\n\n // Inform listeners of the deposit activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Deposit,\n amount,\n amount,\n Status.Success,\n NO_ID\n );\n\n // Receive underlying tokens and mint L-Tokens to the account in a 1:1 ratio\n super.depositFor(_msgSender(), amount);\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Computes fees and net withdrawn amount for a given account withdrawing a\n * given amount.\n * @param account The account initiating the withdrawal.\n * @param amount The amount of the withdrawal.\n */\n function getWithdrawnAmountAndFees(\n address account,\n uint256 amount\n ) public view returns (uint256 withdrawnAmount, uint256 fees) {\n // If the account is eligible to staking tier 2, no fees are applied\n if (ldyStaking.tierOf(account) >= 2) return (amount, 0);\n\n // Cache invested token's decimals number\n uint256 d = SUD.decimalsOf(address(invested()));\n\n // Convert amount and fees rate to SUD\n uint256 amountSUD = SUD.fromAmount(amount, d);\n uint256 feesRateSUD = SUD.fromRate(feesRateUD7x3, d);\n\n // Compute fees and withdrawn amount (initial amount minus fees)\n uint256 feesSUD = (amountSUD * feesRateSUD) / SUD.fromInt(100, d);\n fees = SUD.toAmount(feesSUD, d);\n withdrawnAmount = amount - fees;\n }\n\n /**\n * @notice Allows instaneously exchanging a given amount of L-Tokens for the same\n * amount of underlying tokens. It will fail if the contract currently doesn't hold\n * enough underlying tokens to cover the withdrawal.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestWithdrawal() function otherwise.\n * @param amount The amount L-Tokens to withdraw.\n */\n function instantWithdrawal(uint256 amount) external whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L48\");\n\n // Can the contract cover this withdrawal plus all already queued requests?\n bool cond1 = totalQueued + amount <= usableUnderlyings;\n\n // Is caller eligible to staking tier 2 and the contract can cover this withdrawal?\n bool cond2 = ldyStaking.tierOf(_msgSender()) >= 2 && amount <= usableUnderlyings;\n\n // Revert if conditions are not met for the withdrawal to be processed instantaneously\n if (!(cond1 || cond2)) revert(\"L49\");\n\n // Else, retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(_msgSender(), amount);\n\n // Increase unclaimed fees amount accordingly\n unclaimedFees += fees;\n\n // Decrease usable underlyings balance accordingly\n usableUnderlyings -= withdrawnAmount;\n\n // Inform listeners of this instant withdrawal activity event\n emit ActivityEvent(\n NO_ID,\n _msgSender(),\n Action.Withdraw,\n amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Burn withdrawal fees from the account\n _burn(_msgSender(), fees);\n\n // Burn account's withdrawn L-Tokens and transfer to it underlying tokens in a 1:1 ratio\n super.withdrawTo(_msgSender(), withdrawnAmount);\n }\n\n /**\n * @notice Allows requesting the exchange of a given amount of L-Tokens for the same\n * amount of underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n * @param amount The amount L-Tokens to withdraw.\n */\n function requestWithdrawal(\n uint256 amount\n ) public payable whenNotPaused notBlacklisted(_msgSender()) {\n // Ensure the account has enough L-Tokens to withdraw\n require(amount <= balanceOf(_msgSender()), \"L53\");\n\n // Ensure the requested amount doesn't overflow uint96\n require(amount <= type(uint96).max, \"L54\");\n\n // Ensure the sender attached the pre-paid processing gas fees\n require(msg.value == 0.003 * 10 ** 18, \"L55\");\n\n // Create withdrawal request data\n WithdrawalRequest memory request = WithdrawalRequest({\n account: _msgSender(),\n amount: uint96(amount)\n });\n\n // Will hold the request ID\n uint256 requestId;\n\n // Append request to the withdrawal queue:\n // - At the beginning, if account is eligible to staking tier 2 and cursor is not 0\n if (ldyStaking.tierOf(_msgSender()) >= 2 && withdrawalQueueCursor > 0) {\n withdrawalQueueCursor--;\n requestId = withdrawalQueueCursor;\n withdrawalQueue[requestId] = request;\n }\n // - At the end else\n else {\n withdrawalQueue.push(request);\n requestId = withdrawalQueue.length - 1;\n }\n\n // Increase total amount queued accordingly\n totalQueued += amount;\n\n // Inform listeners of this new queued withdrawal activity event\n emit ActivityEvent(\n int256(requestId),\n _msgSender(),\n Action.Withdraw,\n amount,\n amount,\n Status.Queued,\n NO_ID\n );\n\n // Burn withdrawal L-Tokens amount from account's balance\n _burn(_msgSender(), amount);\n\n // Forward pre-paid processing gas fees to the withdrawer wallet\n (bool sent, ) = withdrawer.call{value: msg.value}(\"\");\n require(sent, \"L56\");\n }\n\n /**\n * @notice Processes queued withdrawal requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n * @dev For further details, see \"LToken > Withdrawals\" section of whitepaper.\n */\n function processQueuedRequests() external onlyWithdrawer whenNotPaused {\n // Accumulators variables, will be written on-chain after the loop\n uint256 cumulatedFees = 0;\n uint256 cumulatedWithdrawnAmount = 0;\n uint256 nextRequestId = withdrawalQueueCursor;\n\n // Cache queue length to avoid multiple SLOADs and avoid infinite loop as big\n // requests are increasing the queue length when moved at the end of the queue.\n uint256 queueLength = withdrawalQueue.length;\n\n // Iterate over requests to be processed\n while (nextRequestId < queueLength) {\n // Stop processing requests if there is not enough gas left to continue the\n // loop and properly end the function call. This prevents an attacker from\n // blocking the withdrawal processing by creating a ton of tiny requests so\n // this function call cannot fit anymore in block gas limit.\n if (gasleft() < 45000) break;\n\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[nextRequestId];\n\n // Skip empty request (processed big requests or cancelled requests)\n if (request.account == address(0)) {}\n //\n // If account has been blacklisted since request emission\n else if (isBlacklisted(request.account)) {\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request in the frozen requests list\n frozenRequests.push(request);\n }\n //\n // Or if request is a big request, move it at the end of the queue for now.\n // This request will be processed manually later using processBigQueuedRequest()\n else if (request.amount > getExpectedRetained() / 2) {\n // Inform listeners of this queued request being moved at the end of the queue\n emit ActivityEvent(\n int256(nextRequestId),\n _msgSender(),\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Moved,\n int256(withdrawalQueue.length)\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Append request at the end of the queue\n withdrawalQueue.push(request);\n }\n //\n // Else, continue request processing\n else {\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Break if the contract doesn't hold enough funds to cover the request\n if (withdrawnAmount > usableUnderlyings - cumulatedWithdrawnAmount) break;\n\n // Accumulate fees and withdrawn amount\n cumulatedFees += fees;\n cumulatedWithdrawnAmount += withdrawnAmount;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(nextRequestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[nextRequestId];\n\n // Transfer underlying tokens to account. Burning L-Tokens is not required\n // as equestWithdrawal() already did it.\n // Security note: Re-entrancy warning are disabled as the request has\n // just been deleted from the queue, it will so be skipped if trying to\n // process it again.\n // slither-disable-next-line reentrancy-no-eth\n underlying().safeTransfer(request.account, withdrawnAmount);\n }\n\n // Increment next request ID\n nextRequestId++;\n }\n\n // Increase unclaimed fees by the amount of cumulated fees\n unclaimedFees += cumulatedFees;\n\n // Decrease usable underlyings by the cumulated amount of withdrawn underlyings\n usableUnderlyings -= cumulatedWithdrawnAmount;\n\n // Decrease total amount queued by the cumulated amount requested\n totalQueued -= cumulatedWithdrawnAmount + cumulatedFees;\n\n // Update new queue cursor\n withdrawalQueueCursor = nextRequestId;\n\n // Retention rate cannot exceeds as the withdrawal decreases both usable\n // underlyings and expected retained amounts by the same number and as the\n // expected retained amount is a subset of usable underlyings amount.\n }\n\n /**\n * @notice Processes a given queued big withdrawal request (one that exceeds half of\n * the retention rate).\n * @dev In contrast to non-big requests processing, this function will uses to fund\n * wallet's balance to fill the request. This allows processing requests that are\n * greater than retention rate without having to exceed this rate on the contract.\n * @param requestId The ID of the big request to process.\n */\n function processBigQueuedRequest(uint256 requestId) external onlyFund whenNotPaused {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure the request is active\n require(request.account != address(0), \"L66\");\n\n // Ensure the request emitter has not been blacklisted since request emission\n require(!isBlacklisted(request.account), \"L50\");\n\n // Ensure this is indeed a big request\n require(request.amount > getExpectedRetained() / 2, \"L51\");\n\n // Retrieve withdrawal fees and net withdrawn amount\n (uint256 withdrawnAmount, uint256 fees) = getWithdrawnAmountAndFees(\n request.account,\n request.amount\n );\n\n // Ensure withdrawn amount can be covered by contract + fund wallet balances\n uint256 fundBalance = underlying().balanceOf(fund);\n require(withdrawnAmount <= usableUnderlyings + fundBalance, \"L52\");\n\n // Increase amount of unclaimed fees accordingly\n unclaimedFees += fees;\n\n // Decrease total queued amount by request amount\n totalQueued -= request.amount;\n\n // Increment queue cursor if request was the next request to be processed\n if (requestId == withdrawalQueueCursor) withdrawalQueueCursor++;\n\n // Inform listeners of this queued withdrawal processing activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n withdrawnAmount,\n Status.Success,\n NO_ID\n );\n\n // Remove request from queue\n delete withdrawalQueue[requestId];\n\n // If fund wallet's balance can cover request, rely on it only\n if (withdrawnAmount <= fundBalance) {\n underlying().safeTransferFrom(_msgSender(), request.account, withdrawnAmount);\n }\n // Else, cover request from both fund wallet and contract balances\n else {\n // Compute amount missing from fund wallet to cover request\n uint256 missingAmount = withdrawnAmount - fundBalance;\n\n // Decrease usable amount of underlying tokens accordingly\n usableUnderlyings -= missingAmount;\n\n // Transfer entire fund balance to request's emitter\n underlying().safeTransferFrom(_msgSender(), request.account, fundBalance);\n\n // Transfer missing amount from contract balance to request emitter\n underlying().safeTransfer(request.account, missingAmount);\n }\n\n // Transfer exceeding underlying tokens to the fund wallet\n _transferExceedingToFund();\n }\n\n /**\n * @notice Cancels a given withdrawal request. The request emitter receive back its\n * L-Tokens and no fees will be charged.\n * @param requestId The ID of the withdrawal request to cancel.\n */\n function cancelWithdrawalRequest(\n uint256 requestId\n ) public whenNotPaused notBlacklisted(_msgSender()) {\n // Retrieve request data\n WithdrawalRequest memory request = withdrawalQueue[requestId];\n\n // Ensure request belongs to caller\n require(_msgSender() == request.account, \"L57\");\n\n // Decrease total amount queued accordingly\n totalQueued -= request.amount;\n\n // Delete the withdrawal request from queue\n delete withdrawalQueue[requestId];\n\n // Inform listeners of this cancelled withdrawal request activity event\n emit ActivityEvent(\n int256(requestId),\n request.account,\n Action.Withdraw,\n request.amount,\n request.amount,\n Status.Cancelled,\n NO_ID\n );\n\n // Mint back L-Tokens to account\n _mint(request.account, uint256(request.amount));\n }\n\n /**\n * @notice Used by the fund wallet to repatriate underlying tokens on the contract\n * whenever those are required to fulfill some withdrawal requests.\n * @dev The function will revert if repatriated amount makes the contract exceeding\n * the retention rate.\n * @param amount The amount of underlying tokens to repatriate.\n */\n function repatriate(uint256 amount) external onlyFund whenNotPaused {\n // Ensure the fund wallet has enough funds to repatriate\n require(amount <= underlying().balanceOf(fund), \"L58\");\n\n // Calculate new contract usable balance\n uint256 newBalance = usableUnderlyings + amount;\n\n // Ensure the new balance doesn't exceed the retention rate\n require(newBalance <= getExpectedRetained(), \"L59\");\n\n // Increase usable underlyings amount by repatriated amount\n usableUnderlyings += amount;\n\n // Transfer amount from fund wallet to contract\n underlying().safeTransferFrom(_msgSender(), address(this), amount);\n }\n\n /// @notice Used by owner to claim fees generated from successful withdrawals.\n function claimFees() external onlyOwner {\n // Ensure there are some fees to claim\n require(unclaimedFees > 0, \"L60\");\n\n // Ensure the contract holds enough underlying tokens to cover fees\n require(usableUnderlyings >= unclaimedFees, \"L61\");\n\n // Decrease usable underlyings amount accordingly\n usableUnderlyings -= unclaimedFees;\n\n // Store fees amount in memory and reset unclaimed fees amount\n uint256 fees = unclaimedFees;\n unclaimedFees = 0;\n\n // Transfer unclaimed fees to owner\n underlying().safeTransfer(owner(), fees);\n }\n}\n" }, + "contracts/src/LTokenSignaler.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {GlobalOwnableUpgradeable} from \"./abstracts/GlobalOwnableUpgradeable.sol\";\n\n/**\n * @title LTokenSignaler\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n *\n * @notice Used to inform subgraph from the existence of a new L-Token contract. Once\n * signaled, a L-Token will start being indexed.\n *\n * @dev Signal are ignored by the subgraph if the L-Token is already known by it.\n *\n * @custom:security-contact security@ledgity.com\n */\ncontract LTokenSignaler is Initializable, UUPSUpgradeable, GlobalOwnableUpgradeable {\n /**\n * @notice Emitted to inform subgraph of the existence of a new L-Token contract.\n * @param lTokenAddress The address of the L-Token contract to signal.\n */\n event LTokenSignalEvent(address indexed lTokenAddress);\n\n /**\n * @notice Prevents implementation contract from being initialized as recommended by\n * OpenZeppelin.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-_disableInitializers--\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer function of the contract. It replaces the constructor()\n * function in the context of upgradeable contracts.\n * @dev See: https://docs.openzeppelin.com/contracts/4.x/upgradeable\n */\n function initialize(address globalOwner_) public initializer {\n __GlobalOwnable_init(globalOwner_);\n __UUPSUpgradeable_init();\n }\n\n /**\n * @notice Override of UUPSUpgradeable._authorizeUpgrade() function restricted to\n * global owner. It is called by the proxy contract during an upgrade.\n * @param newImplementation The address of the new implementation contract.\n */\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\n\n /**\n * @notice Signals a LToken contract to the TheGraph subgraph of the current chain.\n * @param lTokenAddress The address of the LToken contract to signal.\n */\n function signalLToken(address lTokenAddress) external onlyOwner {\n // Signal the LToken contract\n emit LTokenSignalEvent(lTokenAddress);\n }\n}\n" + }, "contracts/src/PreMining.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.18;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LToken} from \"./LToken.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Ownable2Step} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/security/Pausable.sol\";\n\n/**\n * @title PreMining\n * @author Lila Rest (https://lila.rest)\n * @custom:security-contact security@ledgity.com\n\n * @notice PreMining pool contract, allowing accounts to lock underlying tokens in a \n * pre-defined L-Token contract, over a given duration (in months), in exchange of \n * vested LDY rewards.\n * \n * @dev Intuition\n * \n * Lifecycle of a lockdrop pool is composed by 3 main phases:\n * 1) Deposit: During this phase, users can lock their underlying tokens.\n * 2) Claim: During this phase, users can claim their LDY rewards.\n * 3) Recovery: During this phase, owner can recover remaining ERC20 on the contract.\n * \n * Transitioning between two phases is manually triggered by contract's owner.\n * To ensure fair usage of this power and prevent potential misuse:\n * - the Recovery phase cannot start before 3 months after the end of rewards vesting,\n * - the Recovery phase cannot start before 3 months after the maximum lock end.\n * \n * Finally, note that this contract proxies main L-Token contract's functions:\n * - lock() --> deposit()\n * - instantUnlock() --> instantWithdrawal()\n * - requestUnlock() --> requestWithdrawal()\n * This design enables users to interact with the PreMining contract in a similar fashion\n * to the L-Token contract.\n * \n * @dev Definitions:\n * - Locker: An account that has locked underlying tokens in the pool.\n * \n * @custom:security-contact security@ledgity.com\n */\ncontract PreMining is Ownable2Step, Pausable {\n using SafeERC20 for IERC20;\n\n /**\n * @notice Represents the lock information of an account.\n * @param amount Amount of underlying tokens locked.\n * @param duration Duration of the lock (in months).\n * @param hasUnlocked Whether the account has unlocked its locked tokens.\n * @param claimedRewards Amount of LDY rewards already claimed.\n * @param lockEndTimestamp Timestamp at which the account's lock ends.\n */\n struct AccountLock {\n uint240 amount;\n uint8 duration;\n bool hasUnlocked;\n uint216 claimedRewards;\n uint40 lockEndTimestamp;\n }\n\n /// @notice Holds the amount of LDY to be distributed to lockers.\n uint256 public immutable maxDistributedLDY;\n\n /// @notice Holds the maximum total amount of L-Tokens that can be locked.\n uint256 public immutable lockedHardCap;\n\n /// @notice Holds the minimum possible lock duration (in months).\n uint8 public immutable minLockDuration;\n\n /// @notice Holds the maximum possible lock duration (in months).\n uint8 public immutable maxLockDuration;\n\n /// @notice Holds the duration of LDY rewards vesting (in months).\n uint8 public immutable vestingDuration;\n\n /// @notice Holds a reference to the locked L-Token contract.\n LToken public immutable lToken;\n\n /// @notice Holds a reference to the L-Token underlying stablecoin.\n IERC20 public immutable underlyingToken;\n\n /// @notice Holds the max pool weight.\n uint256 public immutable maxWeight;\n\n /// @notice Holds a reference to the LDY token contract.\n IERC20 public ldyToken;\n\n /// @notice Holds lockers' participations informations.\n mapping(address => AccountLock) public accountsLocks;\n\n /// @notice Holds the total amount of locked underlying tokens.\n uint256 public totalLocked;\n\n /// @notice Holds whether the Deposit phase has ended.\n bool public hasDepositPhaseEnded;\n\n /// @notice Holds whether the Claim phase has started.\n bool public hasClaimPhaseStarted;\n\n /// @notice Holds whether the Recovery phase has started.\n bool public hasRecoveryPhaseStarted;\n\n /// @notice Holds the timestamp at which the Claim phase started.\n uint256 public claimPhaseStartTimestamp;\n\n /// @notice Holds an ordered queue of accounts that requested to unlock their tokens.\n address[] public unlockRequests;\n\n /// @notice Holds the index of the first request in the queue (a.k.a, next one to be processed).\n uint256 public unlockRequestsCursor;\n\n /// @notice Emitted to inform about a new lock/deposit.\n event Lock(address indexed account, uint256 amount, uint8 duration);\n\n /// @notice Top-level checks and code shared by both unlock functions.\n modifier safeUnlock() {\n // Ensure that the account's lock has ended\n require(accountsLocks[msg.sender].lockEndTimestamp <= block.timestamp, \"L68\");\n\n // Ensure the account hasn't already unlocked its tokens\n require(!accountsLocks[msg.sender].hasUnlocked, \"L69\");\n\n // Ensure the account has something to unlock\n require(accountsLocks[msg.sender].amount > 0, \"L70\");\n\n // Indicate that account has unlocked its tokens\n accountsLocks[msg.sender].hasUnlocked = true;\n _;\n }\n\n /**\n * @notice This constructor function etches the lockdrop terms in immutable states.\n * Ensuring that those terms cannot be modified after deployment.\n * @param lTokenAddress_ Address of the L-Token contract to use.\n * @param maxDistributedLDY_ Amount of LDY to be distributed to lockers.\n * @param lockedHardCap_ Maximum total amount of L-Tokens that can be locked.\n * @param minLockDuration_ Minimum possible lock duration (in months).\n * @param maxLockDuration_ Maximum possible lock duration (in months).\n * @param vestingDuration_ Duration of LDY rewards vesting (in months).\n */\n constructor(\n address lTokenAddress_,\n uint256 maxDistributedLDY_,\n uint256 lockedHardCap_,\n uint8 minLockDuration_,\n uint8 maxLockDuration_,\n uint8 vestingDuration_\n ) {\n // Ensure minLockDuration is at least 1 month\n require(minLockDuration_ >= 1, \"L72\");\n\n // Ensure minLockDuration is not greater than maxLockDuration\n require(minLockDuration_ <= maxLockDuration_, \"L73\");\n\n // Set immutable states\n lToken = LToken(lTokenAddress_);\n underlyingToken = IERC20(address(lToken.underlying()));\n lockedHardCap = lockedHardCap_;\n maxDistributedLDY = maxDistributedLDY_;\n minLockDuration = minLockDuration_;\n maxLockDuration = maxLockDuration_;\n vestingDuration = vestingDuration_;\n maxWeight = lockedHardCap * uint256(maxLockDuration);\n }\n\n /**\n * @notice Public implementation of Pausable's pausing and unpausing functions, but\n * restricted to contract's owner.\n */\n function pause() public onlyOwner {\n _pause();\n }\n\n function unpause() public onlyOwner {\n _unpause();\n }\n\n /**\n * @notice Updates the LDY token contract address.\n * @dev As the first Ledgity Yield lockdrop campaigns will start before the LDY TGE,\n * this function allows the contract's owner to set the LDY token address once it\n * becomes available.\n * @param ldyTokenAddress Address of the LDY token contract.\n */\n function setLDYToken(address ldyTokenAddress) external onlyOwner {\n // Prevent owner from changing the LDY address after Claim phase has started\n require(!hasClaimPhaseStarted, \"L74\");\n\n // Set LDY token address\n ldyToken = IERC20(ldyTokenAddress);\n }\n\n /**\n * @notice Closes the Deposit phase. After calling this function, account won't be\n * able to lock additional underlying tokens anymore.\n */\n function endDepositPhase() external onlyOwner {\n hasDepositPhaseEnded = true;\n }\n\n /**\n * @notice Opens the Claim phase. After calling this function, lockers will be able\n * to start claiming their LDY rewards.\n */\n function startClaimPhase() external onlyOwner {\n // Ensure Claim phase has not already started\n require(!hasClaimPhaseStarted, \"L76\");\n\n // Ensure that LDY token address is available\n require(address(ldyToken) != address(0), \"L77\");\n\n // Set Claim phase as started and store the start timestamp\n hasClaimPhaseStarted = true;\n claimPhaseStartTimestamp = block.timestamp;\n }\n\n /**\n * @notice Opens the Recovery phase. After calling this function, the contract owner\n * will be able to recover remaining ERC20 tokens on the contract.\n * Note that this won't close the Claim phase and lockers will still be able to claim\n * their LDY rewards.\n */\n function startRecoveryPhase() external onlyOwner {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L79\");\n\n // Compute some durations in seconds\n uint256 threeMonthsInSecond = 3 * 30 days;\n uint256 vestingInSecond = uint256(vestingDuration) * 30 days;\n uint256 maxLockInSecond = uint256(maxLockDuration) * 30 days;\n\n // Compute timestamp of vesting end + 3 months\n uint256 afterVestingTimestamp = claimPhaseStartTimestamp +\n vestingInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the end of reward vesting\n // This prevents owner from recovering LDY before lockers can claim their rewards\n require(block.timestamp >= afterVestingTimestamp, \"L80\");\n\n // Compute end of maximum lock + 3 months\n // Note that claimPhaseStartTimestamp is used for simplicity even if it can exist a time\n // span between Deposit and Claim phases.\n uint256 afterMaxLockTimestamp = claimPhaseStartTimestamp +\n maxLockInSecond +\n threeMonthsInSecond;\n\n // Ensure we are at least 3 months after the maximum lock end\n // This prevents owner from recovering underlying tokens before lockers can unlock those\n require(block.timestamp >= afterMaxLockTimestamp, \"L81\");\n\n // Set recovery phase as started\n hasRecoveryPhaseStarted = true;\n }\n\n /**\n * @notice Recovers a specified amount of a given token address. Will revert if\n * recovery phase has not started yet or if the contract doesn't hold enough tokens.\n * @param tokenAddress The address of the token to recover.\n * @param amount The amount of token to recover.\n */\n function recoverERC20(address tokenAddress, uint256 amount) external onlyOwner {\n // Ensure recovery phase has started\n require(hasRecoveryPhaseStarted, \"L82\");\n\n // Create a reference to token's contract\n IERC20 tokenContract = IERC20(tokenAddress);\n\n // Ensure there is enough tokens to recover\n require(tokenContract.balanceOf(address(this)) >= amount, \"L83\");\n\n // Transfer the recovered token amount to the sender (owner)\n tokenContract.safeTransfer(msg.sender, amount);\n }\n\n /**\n * @notice Compute the total amount of LDY rewards that a given account is eligible to.\n * @dev Note: This function neither considers vesting nor already claimed rewards.\n * @param account The account to compute the eligible rewards of.\n * @return The total amount of LDY rewards that the account is eligible to.\n */\n function eligibleRewardsOf(address account) public view returns (uint256) {\n // Compute account's lock weight\n uint256 lockerWeight = accountsLocks[account].amount * accountsLocks[account].duration;\n\n // Compute amount of LDY that this locker is eligible to\n if (maxWeight == 0) return 0;\n else return (maxDistributedLDY * lockerWeight) / maxWeight;\n }\n\n /**\n * @notice Allows locking a specified amount of underlying tokens for a given duration.\n * By locking, an account became eligible to a portion of the distributed LDY rewards.\n * @dev This function proxies LToken.deposit()\n * @dev Lockers can extend their lock duration by calling this function again with a\n * greater duration and 0 as amount.\n * @param amount Amount of underlying tokens to lock.\n * @param duration Duration of the lock (in months).\n */\n function lock(uint256 amount, uint8 duration) external whenNotPaused {\n // Ensure Deposit phase has not ended yet\n require(!hasDepositPhaseEnded, \"L84\");\n\n // Ensure account hasn't already unlocked a past lock\n require(!accountsLocks[msg.sender].hasUnlocked, \"L71\");\n\n // Ensure lock duration is in valid range\n require(duration >= minLockDuration && duration <= maxLockDuration, \"L85\");\n\n // Ensure it won't exceed the hardcap\n require(totalLocked + amount <= uint256(lockedHardCap), \"L86\");\n\n // Increase account's locked amount\n accountsLocks[msg.sender].amount += uint240(amount);\n\n // Increase total locked amount accordingly\n totalLocked += amount;\n\n // Use existing lock duration if greater than the new one\n uint8 existingDuration = accountsLocks[msg.sender].duration;\n uint8 appliedDuration = existingDuration > duration ? existingDuration : duration;\n\n // Update account's lock duration\n accountsLocks[msg.sender].duration = appliedDuration;\n\n // Update account's lock end timestamp\n accountsLocks[msg.sender].lockEndTimestamp = uint40(\n block.timestamp + uint40(appliedDuration) * 30 days\n );\n\n // Emit a Lock event\n emit Lock(msg.sender, amount, appliedDuration);\n\n // If amount is 0, skip deposit\n if (amount == 0) return;\n\n // Transfer underlyingToken from account to contract\n underlyingToken.safeTransferFrom(msg.sender, address(this), amount);\n\n // Deposit USDC in the L-Token contract\n underlyingToken.safeApprove(address(lToken), amount);\n lToken.deposit(amount);\n }\n\n /**\n * @notice Allows the caller to instaneously unlock its locked amount of underlying\n * tokens.\n * @dev In order to save some gas and time to users, frontends should propose this\n * function to users only when it has been verified that it will not revert. They\n * should propose the requestUnlock() function otherwise.\n */\n function instantUnlock() external whenNotPaused safeUnlock {\n // Retrieve underlying tokens from the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.instantWithdrawal(unlockedAmount);\n\n // Transfer underlying tokens back to caller\n underlyingToken.safeTransfer(msg.sender, unlockedAmount);\n }\n\n /**\n * @notice Allows the call to request for the unlocking of its locked amount of\n * underlying tokens. The request will be automatically processed later.\n * @dev The sender must attach 0.003 ETH to pre-pay the future processing gas fees\n * paid by the withdrawer wallet.\n */\n function requestUnlock() external payable whenNotPaused safeUnlock {\n // Put account in the unlock requests queue\n unlockRequests.push(msg.sender);\n\n // Request underlying tokens to the L-Token contract\n uint256 unlockedAmount = accountsLocks[msg.sender].amount;\n lToken.requestWithdrawal{value: msg.value}(unlockedAmount);\n }\n\n /**\n * @notice Processes queued unlock requests until there is else no more requests,\n * else not enough underlying tokens to continue.\n */\n function processUnlockRequests() external onlyOwner {\n // Store the current request ID to process\n uint256 processedId = unlockRequestsCursor;\n\n // Loop over remaining requests\n while (processedId < unlockRequests.length) {\n // Prevent OOG by stopping request processing if there is not enough gas left\n // to continue the loop and properly end the function call.\n if (gasleft() < 45000) break;\n\n // Retrieve the request account\n address unlockAccount = unlockRequests[processedId];\n\n // Retrieve the unlocked amount\n uint256 unlockAmount = accountsLocks[unlockAccount].amount;\n\n // If the request has already been processed, skip it\n if (unlockAccount != address(0)) {\n // If the contract doesn't hold enough underlying tokens to process the request, stop here\n if (underlyingToken.balanceOf(address(this)) < unlockAmount) break;\n\n // Delete the request\n delete unlockRequests[processedId];\n\n // Transfer underlying back to account\n underlyingToken.safeTransfer(unlockAccount, unlockAmount);\n }\n\n // Increment processed request ID\n processedId++;\n }\n\n // Write back the cursor in storage\n unlockRequestsCursor = processedId;\n }\n\n /**\n * @notice Computes the amount of LDY rewards available to claim for a given account.\n * @dev This function considers vesting and already claimed rewards.\n * @param account The account to compute the available rewards of.\n * @return The amount of LDY rewards available to claim.\n */\n function availableToClaim(address account) public view returns (uint256) {\n // Compute total amount of rewards allocated to this locker\n uint256 totalEligibleRewards = eligibleRewardsOf(account);\n\n // Compute vesting duration in seconds\n uint256 vestingInSeconds = uint256(vestingDuration) * 30 days;\n\n // Compute elapsed months since claim phase started, and cap it to vesting duration\n uint256 elapsedTime = block.timestamp - claimPhaseStartTimestamp;\n if (elapsedTime > vestingInSeconds) elapsedTime = vestingInSeconds;\n\n // Compute total available to claim (proportionally to elapsed time)\n uint256 totalAvailableToClaim = (totalEligibleRewards * elapsedTime) / vestingInSeconds;\n\n // Else return net claimable (available minus already claimed)\n return totalAvailableToClaim - accountsLocks[account].claimedRewards;\n }\n\n /// @notice Allows the caller to claim its available LDY rewards.\n function claimRewards() external whenNotPaused {\n // Ensure Claim phase has started\n require(hasClaimPhaseStarted, \"L87\");\n\n // Compute claimable LDY rewards\n uint256 claimableLDY = availableToClaim(msg.sender);\n\n // Increase account claimed amount accordingly\n accountsLocks[msg.sender].claimedRewards += uint216(claimableLDY);\n\n // Transfer rewards to account\n ldyToken.safeTransfer(msg.sender, claimableLDY);\n }\n}\n" } }, "settings": { - "evmVersion": "london", "optimizer": { "enabled": true, "runs": 200 diff --git a/contracts/src/DummyLDYStaking.sol b/contracts/src/DummyLDYStaking.sol deleted file mode 100644 index f8aa6842..00000000 --- a/contracts/src/DummyLDYStaking.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.18; - -import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; - -/** - * @title LDYStaking - * @author Lila Rest (https://lila.rest) - * @custom:security-contact security@ledgity.com - * - * @notice This contract acts as a placeholder for the real LDYStaking contract until - * this one is deployed. - * - * @dev This contract only implements tierOf() function from LDYStaking as it's the only - * one the LToken contract relies on. - * - * @custom:security-contact security@ledgity.com - */ -contract LDYStaking is Ownable2Step { - /** - * @notice Holds a mapping of addresses that default to the highest staking tier. - * @dev This is notably used to allow PreMining contracts to benefit from 0% - * withdrawal fees in L-Tokens contracts, when accounts unlock their funds. - */ - mapping(address => bool) public highTierAccounts; - - /** - * @notice Update high tier status of a given account. - * @param account The account to update the high tier status of. - */ - function setHighTierAccount(address account, bool status) public onlyOwner { - highTierAccounts[account] = status; - } - - /** - * @dev Dummy tierOf() function that always return that the given account is not - * elligible to any LDY staking tier, except if the account is in the - * highTierAccounts mapping. - * @param account The account to check the tier of. - */ - function tierOf(address account) public view returns (uint256 tier) { - if (highTierAccounts[account]) return 3; - return 0; - } -} diff --git a/contracts/src/LDY.sol b/contracts/src/LDY.sol new file mode 100644 index 00000000..aca65402 --- /dev/null +++ b/contracts/src/LDY.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; + +/** + * @title LDY + * @author Lila Rest (lila@ledgity.com) + * @dev The $LDY is the utility and governance token of the entire Ledgity ecosystem. + * + * This contract has been kept as minimal as possible to enforce stakeholders safety + * but also to pave the way for sensitive use cases like cross-chain bridging, use in + * governance scenarios, and compatibility with 3rd party DApps. + * + * It is non-upgradeable, non-ownable, non-pausable, non-mintable, and non-restrictable. + * It implements nothing more than what is provided by its OpenZepellin ancestors. + * + * Moreover, to eliminate the need for ownership and complex vesting functions, the + * entire supply is minted at deployment-time. Vesting of allocated tokens is then + * managed via Sablier streams that anyone can verify on this page: + * https://docs.ledgity.finance/tokenomics/vesting-proofs + * + * Specifications: + * - Name: Ledgity Token + * - Symbol: LDY + * - Decimals: 18 + * - Total supply: 75,000,000 + * + * @custom:security-contact security@ledgity.com + */ +contract LDY is ERC20, ERC20Burnable { + constructor() ERC20("Ledgity Token", "LDY") { + _mint(msg.sender, 75_000_000 * 10 ** decimals()); + } +} diff --git a/contracts/src/LDYStaking.sol b/contracts/src/LDYStaking.sol new file mode 100644 index 00000000..21faa3b3 --- /dev/null +++ b/contracts/src/LDYStaking.sol @@ -0,0 +1,406 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +// Contracts +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {BaseUpgradeable} from "./abstracts/base/BaseUpgradeable.sol"; + +// Libraries +import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; + +// Interfaces +import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; + +/** + * @title LDYStaking + * @custom:security-contact security@ledgity.com + * + * @dev This contract implements tierOf() function from LDYStaking as it's the only + * one the LToken contract relies on. + * + * @custom:security-contact security@ledgity.com + */ +contract LDYStaking is BaseUpgradeable, ReentrancyGuardUpgradeable { + using SafeERC20Upgradeable for IERC20Upgradeable; + + /** + * @notice Represents a user staking info in array. + * @param stakedAmount Amount of the stake. + * @param unStakeAt Unstake at. + * @param duration Staking period in seconds. + * @param rewardPerTokenPaid Reward per token paid. + * @param rewards Rewards to be claimed. + */ + struct StakingInfo { + uint256 stakedAmount; + uint256 unStakeAt; + uint256 duration; + uint256 rewardPerTokenPaid; + uint256 rewards; + } + + /// @notice Stake and Reward token. + IERC20Upgradeable public stakeRewardToken; + + /// @notice Minimal stake duration for perks. + uint256 public stakeDurationForPerks; + + /// @notice Minimal stake amount for perks. + uint256 public stakeAmountForPerks; + + /// @notice Stake durations. + uint256[] public stakeDurations; + + /// @notice Duration of the rewards (in seconds). + uint256 public rewardsDuration; + + /// @notice Timestamp of when the rewards finish. + uint256 public finishAt; + + /// @notice Timestamp of the reward updated. + uint256 public lastUpdateTime; + + /// @notice Reward per second(total rewards / duration). + uint256 public rewardRatePerSec; + + /// @notice Reward per token stored, sum of (reward rate * dt * 1e18 / total supply). + uint256 public rewardPerTokenStored; + + /// @notice Total staked amounts. + uint256 public totalStaked; + + /// @notice User stakingInfo map, user address => array of the staking info + mapping(address => StakingInfo[]) public userStakingInfo; + + /** + * @notice Emitted when users stake token + * @param user User address + * @param stakeIndex Latest index of user staking pool + * @param amount Staked amount + */ + event Staked(address indexed user, uint256 stakeIndex, uint256 amount); + + /** + * @notice Emitted when users unstake token + * @param user User address + * @param stakeIndex User staking pool index + * @param amount Staked amount + */ + event Unstaked(address indexed user, uint256 stakeIndex, uint256 amount); + + /** + * @notice Emitted when users claim rewards + * @param user User address + * @param stakeIndex User staking pool index + * @param reward Reward token amount + */ + event RewardPaid(address indexed user, uint256 stakeIndex, uint256 reward); + + /** + * @notice Emitted when admin add rewards. + * @param rewardAmount Reward amount added by admin. + * @param rewardPerSec RewardRatePerSec updated. + */ + event NotifiedRewardAmount(uint256 rewardAmount, uint256 rewardPerSec); + + /** + * @notice Holds a mapping of addresses that default to the highest staking tier. + * @dev This is notably used to allow PreMining contracts to benefit from 0% + * withdrawal fees in L-Tokens contracts, when accounts unlock their funds. + */ + mapping(address => bool) public highTierAccounts; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initializes the contract and sets the initial state variables. This is called by the proxy and should only be called once. + * @dev This function is intended for setting initial values for the contract's state variables. + * @param globalOwner_ The address of the GlobalOwner contract. + * @param globalPause_ The address of the GlobalPause contract. + * @param globalBlacklist_ The address of the GlobalBlacklist contract. + * @param stakeRewardToken_ The address of stake and reward token(LDY token). + * @param stakeDurations_ Available Staking Durations. + * @param stakeDurationForPerks_ Minimal staking duration for perks. + * @param stakeAmountForPerks_ Minimal staking amount for perks. + */ + function initialize( + address globalOwner_, + address globalPause_, + address globalBlacklist_, + address stakeRewardToken_, + uint256[] memory stakeDurations_, + uint256 stakeDurationForPerks_, + uint256 stakeAmountForPerks_ + ) public initializer { + __Base_init(globalOwner_, globalPause_, globalBlacklist_); + stakeRewardToken = IERC20Upgradeable(stakeRewardToken_); + stakeDurations = stakeDurations_; + stakeDurationForPerks = stakeDurationForPerks_; + stakeAmountForPerks = stakeAmountForPerks_; + } + + // -------------------- + // MUTATIVE FUNCTIONS + // -------------------- + + /** + * @notice Staked tokens cannot be withdrawn during the stakeDuration period and are eligible to claim rewards. + * @dev Emits a `Staked` event upon successful staking. + * @param amount The amount of tokens to stake. + * @param stakeDurationIndex The Index of stakeDurations array. + */ + function stake( + uint256 amount, + uint8 stakeDurationIndex + ) external nonReentrant whenNotPaused notBlacklisted(_msgSender()) { + require(amount > 0, "amount = 0"); + require(stakeDurationIndex <= stakeDurations.length - 1, "invalid staking period"); + + _updateReward(address(0), 0); + uint256 stakeDuration = stakeDurations[stakeDurationIndex]; + StakingInfo memory stakingInfo = StakingInfo({ + stakedAmount: amount, + unStakeAt: block.timestamp + stakeDuration, + duration: stakeDuration, + rewardPerTokenPaid: rewardPerTokenStored, + rewards: 0 + }); + + // check whether account is eligible for benefit from the protocol + if (stakeDuration >= stakeDurationForPerks && amount >= stakeAmountForPerks) { + highTierAccounts[_msgSender()] = true; + } + + userStakingInfo[_msgSender()].push(stakingInfo); + + uint256 stakeIndex = userStakingInfo[_msgSender()].length - 1; + totalStaked += amount; + + stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount); + + emit Staked(_msgSender(), stakeIndex, amount); + } + + /** + * @notice Withdraw staked tokens after stakeDuration has passed. + * @dev Emits a `Unstaked` event upon successful withdrawal. + * On full withdrawal, userStakingInfo removes stake pool for stakeIndex. + * @param amount The amount of tokens to withdraw. + * @param stakeIndex The index of user staking pool + */ + function unstake( + uint256 amount, + uint256 stakeIndex + ) external nonReentrant notBlacklisted(_msgSender()) { + require(amount > 0, "amount = 0"); + require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, "invalid stakeIndex"); + require( + block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt, + "not allowed unstaking in the staking period" + ); + require( + amount <= userStakingInfo[_msgSender()][stakeIndex].stakedAmount, + "insufficient amount" + ); + + _updateReward(_msgSender(), stakeIndex); + totalStaked -= amount; + userStakingInfo[_msgSender()][stakeIndex].stakedAmount -= amount; + + // check whether account is eligible for benefit from the protocol + if ( + userStakingInfo[_msgSender()][stakeIndex].duration >= stakeDurationForPerks && + userStakingInfo[_msgSender()][stakeIndex].stakedAmount < stakeAmountForPerks + ) { + highTierAccounts[_msgSender()] = false; + } + + // remove staking info from array on full withdrawal + if (userStakingInfo[_msgSender()][stakeIndex].stakedAmount == 0) { + _claimReward(_msgSender(), stakeIndex); + + userStakingInfo[_msgSender()][stakeIndex] = userStakingInfo[_msgSender()][ + userStakingInfo[_msgSender()].length - 1 + ]; + userStakingInfo[_msgSender()].pop(); + } + stakeRewardToken.safeTransfer(_msgSender(), amount); + + emit Unstaked(_msgSender(), stakeIndex, amount); + } + + /** + * @notice Claim pending rewards. + * @dev Emits a `RewardPaid` event upon successful reward claim. + * @param stakeIndex The index of user staking pool. + */ + function getReward(uint256 stakeIndex) external nonReentrant notBlacklisted(_msgSender()) { + require(userStakingInfo[_msgSender()].length >= stakeIndex + 1, "invalid stakeIndex"); + _updateReward(_msgSender(), stakeIndex); + _claimReward(_msgSender(), stakeIndex); + } + + // -------------------- + // ADMIN CONFIGURATION + // -------------------- + + /** + * @notice Update Rewards Duration. + * @dev Only callable by owner, and setting available only after rewards period. + * @param duration The nmew rewards duration in seconds. + */ + function setRewardsDuration(uint256 duration) external onlyOwner { + require(finishAt < block.timestamp, "reward duration is not finished"); + rewardsDuration = duration; + } + + /** + * @notice Notify the contract about the amount of rewards to be distributed and update reward parameters. + * @dev Only callable by owner. + * @param amount The amount of reward to be distributed. + */ + function notifyRewardAmount(uint256 amount) external onlyOwner { + require(rewardsDuration > 0, "rewards duration is not set"); + require(amount > 0, "amount = 0"); + + _updateReward(address(0), 0); + + if (block.timestamp >= finishAt) { + rewardRatePerSec = amount / rewardsDuration; + } else { + uint256 remainingRewards = (finishAt - block.timestamp) * rewardRatePerSec; + rewardRatePerSec = (amount + remainingRewards) / rewardsDuration; + } + + require(rewardRatePerSec > 0, "reward rate = 0"); + require( + rewardRatePerSec <= + (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) / + rewardsDuration, + "reward amount > balance" + ); + + finishAt = block.timestamp + rewardsDuration; + lastUpdateTime = block.timestamp; + + stakeRewardToken.safeTransferFrom(_msgSender(), address(this), amount); + + emit NotifiedRewardAmount(amount, rewardRatePerSec); + } + + // -------------------- + // VIEW FUNCTIONS + // -------------------- + + /** + * @notice Get the last time when rewards were applicable for the specified reward token. + * @return Timestamp of the most recent rewards calculation. + */ + function lastTimeRewardApplicable() public view returns (uint256) { + return _min(finishAt, block.timestamp); + } + + /** + * @notice Calculate the reward per token for a given reward token. + * @return Current reward per token. + */ + function rewardPerToken() public view returns (uint256) { + if (totalStaked == 0) { + return rewardPerTokenStored; + } + + return + rewardPerTokenStored + + (rewardRatePerSec * (lastTimeRewardApplicable() - lastUpdateTime) * 1e18) / + totalStaked; + } + + /** + * @notice Calculate the user's stake pool earnings + * @param account Address of the user. + * @param stakeIndex Index of the stakePool + * @return Return earned amounts + */ + function earned(address account, uint256 stakeIndex) public view returns (uint256) { + StakingInfo memory userInfo = userStakingInfo[account][stakeIndex]; + uint256 rewardsSinceLastUpdate = ((userInfo.stakedAmount * + (rewardPerToken() - userInfo.rewardPerTokenPaid)) / 1e18); + return rewardsSinceLastUpdate + userInfo.rewards; + } + + /** + * @notice Get the earned rewards array for a user. + * @param account Address of the user. + * @return Return earned rewards array for a user. + */ + function getEarnedUser(address account) public view returns (uint256[] memory) { + uint256 numberOfPools = userStakingInfo[account].length; + uint256[] memory earnedArray = new uint256[](numberOfPools); + for (uint256 index; index < numberOfPools; index++) { + earnedArray[index] = earned(account, index); + } + return earnedArray; + } + + /** + * @dev tierOf() function that always return that the given account is not + * elligible to any LDY staking tier, except if the account is in the + * highTierAccounts mapping. + * @param account The account to check the tier of. + */ + function tierOf(address account) public view returns (uint256 tier) { + if (highTierAccounts[account]) return 3; + return 0; + } + + /** + * @notice Get User Stake Data. + * @param account The address of user. + * @return StakingInfo array. + */ + function getUserStakes(address account) external view returns (StakingInfo[] memory) { + return userStakingInfo[account]; + } + + /** + * @notice Send rewards to user. + * @dev This is private function, called by getReward function. + * @param account The address of user. + * @param stakeIndex The index of user staking pool. + */ + function _claimReward(address account, uint256 stakeIndex) private { + uint256 reward = userStakingInfo[account][stakeIndex].rewards; + + if (reward > 0) { + userStakingInfo[account][stakeIndex].rewards = 0; + stakeRewardToken.safeTransfer(account, reward); + emit RewardPaid(account, stakeIndex, reward); + } + } + + /** + * @notice Calculate and update user rewards per stakeIndex. + * @dev this is private function, called by stake, unstake, getRewards, and notifyRewardAmount functions. + * @param account The address of user. + * @param stakeIndex The index of user staking pool. + */ + function _updateReward(address account, uint256 stakeIndex) private { + rewardPerTokenStored = rewardPerToken(); + lastUpdateTime = lastTimeRewardApplicable(); + + if (account != address(0)) { + userStakingInfo[account][stakeIndex].rewards = earned(account, stakeIndex); + userStakingInfo[account][stakeIndex].rewardPerTokenPaid = rewardPerTokenStored; + } + } + + /** + * @notice Take minimum value between x and y. + */ + function _min(uint256 x, uint256 y) private pure returns (uint256) { + return x <= y ? x : y; + } +} diff --git a/contracts/src/LToken.sol b/contracts/src/LToken.sol index d7cfd4ad..d219a885 100644 --- a/contracts/src/LToken.sol +++ b/contracts/src/LToken.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.18; import {ERC20WrapperUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol"; import "./abstracts/base/ERC20BaseUpgradeable.sol"; import {InvestUpgradeable} from "./abstracts/InvestUpgradeable.sol"; -import {LDYStaking} from "./DummyLDYStaking.sol"; +import {LDYStaking} from "./LDYStaking.sol"; // Libraries import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/hardhat.config.cts b/hardhat.config.cts index 50d68ae5..5b6beb9f 100644 --- a/hardhat.config.cts +++ b/hardhat.config.cts @@ -29,6 +29,27 @@ try { arbiscanApiKey = secrets.ARBISCAN_API_KEY; } catch (e) {} +// Retrive Sepolia API key from secrets.json (if available) +let sepoliaApiKey: string | undefined; +try { + const secrets = require("./secrets.json"); + sepoliaApiKey = secrets.ETHERSCAN_API_KEY; +} catch (e) {} + +// Retrive BaseScan API key from secrets.json (if available) +let basescanApiKey: string | undefined; +try { + const secrets = require("./secrets.json"); + basescanApiKey = secrets.BASESCAN_API_KEY; +} catch (e) {} + +// Retrive BaseScan API key from secrets.json (if available) +let okxscanApiKey: string | undefined; +try { + const secrets = require("./secrets.json"); + okxscanApiKey = secrets.OKXSCAN_API_KEY; +} catch (e) {} + const config: HardhatUserConfig = { solidity: { version: "0.8.18", @@ -70,6 +91,18 @@ const config: HardhatUserConfig = { }, }, }, + sepolia: { + chainId: 11155111, + url: "https://eth-sepolia.g.alchemy.com/v2/-papiHFcZc0tr4XSPsnwE0bhdTKLetjg", + accounts: deployerPrivateKey ? [deployerPrivateKey] : [], + saveDeployments: true, + verify: { + etherscan: { + apiKey: sepoliaApiKey, + apiUrl: "https://api-sepolia.etherscan.io", + }, + }, + }, lineaGoerli: { chainId: 59140, url: "https://linea-goerli.infura.io/v3/05368c74554249babb6f126ccf325401", @@ -94,17 +127,64 @@ const config: HardhatUserConfig = { accounts: deployerPrivateKey ? [deployerPrivateKey] : [], saveDeployments: true, }, + OKX_X1_mainnet: { + chainId: 196, + url: "https://rpc.xlayer.tech", + accounts: deployerPrivateKey ? [deployerPrivateKey] : [], + saveDeployments: true, + verify: { + etherscan: { + apiKey: okxscanApiKey, + apiUrl: "https://www.oklink.com/api/explorer/v1/contract/verify/async/xlayer", + }, + }, + }, OKX_X1_testnet: { chainId: 195, - url: "https://testrpc.x1.tech", + url: "https://testrpc.xlayer.tech", + accounts: deployerPrivateKey ? [deployerPrivateKey] : [], + saveDeployments: true, + verify: { + etherscan: { + apiKey: okxscanApiKey, + apiUrl: "https://www.oklink.com/api/explorer/v1/contract/verify/async/xlayer_test", + }, + }, + }, + base: { + chainId: 8453, + url: "https://base-mainnet.g.alchemy.com/v2/XH9V8IOVLgFCIP-EAflB27MR0Bc5oVoO", accounts: deployerPrivateKey ? [deployerPrivateKey] : [], saveDeployments: true, + verify: { + etherscan: { + apiKey: basescanApiKey, + apiUrl: "https://api.basescan.org", + }, + }, + }, + baseSepolia: { + chainId: 84532, + url: "https://base-sepolia.g.alchemy.com/v2/spQc9SK_L-lIL2tJpYXuhLk2YJNwbuEr", + accounts: deployerPrivateKey ? [deployerPrivateKey] : [], + saveDeployments: true, + verify: { + etherscan: { + apiKey: basescanApiKey, + apiUrl: "https://api-sepolia.basescan.org", + }, + }, }, }, etherscan: { apiKey: { linea: lineascanApiKey!, arbitrumOne: arbiscanApiKey!, + sepolia: sepoliaApiKey!, + base: basescanApiKey!, + baseSepolia: basescanApiKey!, + OKX_X1_mainnet: okxscanApiKey!, + OKX_X1_testnet: okxscanApiKey!, }, customChains: [ { @@ -115,6 +195,38 @@ const config: HardhatUserConfig = { browserURL: "https://lineascan.build", }, }, + { + network: "base", + chainId: 8453, + urls: { + apiURL: "https://api.basescan.org/api", + browserURL: "https://basescan.org", + }, + }, + { + network: "baseSepolia", + chainId: 84532, + urls: { + apiURL: "https://api-sepolia.basescan.org/api", + browserURL: "https://sepolia.basescan.org", + }, + }, + { + network: "OKX_X1_mainnet", + chainId: 196, + urls: { + apiURL: "https://www.oklink.com/api/explorer/v1/contract/verify/async/api/xlayer", + browserURL: "https://www.oklink.com/xlayer", + }, + }, + { + network: "OKX_X1_testnet", + chainId: 195, + urls: { + apiURL: "https://www.oklink.com/api/explorer/v1/contract/verify/async/api/xlayer_test", + browserURL: "https://www.oklink.com/xlayer-test", + }, + }, ], }, defaultNetwork: "hardhat", diff --git a/public/assets/chains/base.png b/public/assets/chains/base.png new file mode 100644 index 00000000..3ec4d5f7 Binary files /dev/null and b/public/assets/chains/base.png differ diff --git a/report.md b/report.md index 5d5ce581..9e8fc6ac 100644 --- a/report.md +++ b/report.md @@ -1,239 +1,183 @@ **THIS CHECKLIST IS NOT COMPLETE**. Use `--show-ignored-findings` to show all the results. Summary - - [divide-before-multiply](#divide-before-multiply) (2 results) (Medium) - - [incorrect-equality](#incorrect-equality) (1 results) (Medium) - - [write-after-write](#write-after-write) (1 results) (Medium) - [events-access](#events-access) (2 results) (Low) - - [events-maths](#events-maths) (2 results) (Low) - - [calls-loop](#calls-loop) (3 results) (Low) + - [events-maths](#events-maths) (3 results) (Low) + - [calls-loop](#calls-loop) (1 results) (Low) - [reentrancy-events](#reentrancy-events) (1 results) (Low) - - [timestamp](#timestamp) (1 results) (Low) - - [boolean-equal](#boolean-equal) (1 results) (Informational) + - [timestamp](#timestamp) (4 results) (Low) - [costly-loop](#costly-loop) (3 results) (Informational) - - [dead-code](#dead-code) (2 results) (Informational) - [low-level-calls](#low-level-calls) (1 results) (Informational) - - [redundant-statements](#redundant-statements) (7 results) (Informational) -## divide-before-multiply -Impact: Medium + - [naming-convention](#naming-convention) (1 results) (Informational) + - [redundant-statements](#redundant-statements) (4 results) (Informational) +## events-access +Impact: Low Confidence: Medium - [ ] ID-0 -[InvestUpgradeable._calculatePeriodRewards(uint40,uint40,uint16,uint256)](contracts/src/abstracts/InvestUpgradeable.sol#L258-L279) performs a multiplication on the result of a division: - - [growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1,d)](contracts/src/abstracts/InvestUpgradeable.sol#L273) - - [rewardsSUD = (investedAmountSUD * growthSUD) / SUD.fromInt(100,d)](contracts/src/abstracts/InvestUpgradeable.sol#L277) +[LToken.setWithdrawer(address)](contracts/src/LToken.sol#L300-L306) should emit an event for: + - [withdrawer = withdrawer_](contracts/src/LToken.sol#L305) -contracts/src/abstracts/InvestUpgradeable.sol#L258-L279 +contracts/src/LToken.sol#L300-L306 - [ ] ID-1 -[InvestUpgradeable._calculatePeriodRewards(uint40,uint40,uint16,uint256)](contracts/src/abstracts/InvestUpgradeable.sol#L258-L279) performs a multiplication on the result of a division: - - [elapsedYearsSUD = (elapsedTimeSUD * SUD.fromInt(1,d)) / SUD.fromInt(31536000,d)](contracts/src/abstracts/InvestUpgradeable.sol#L269) - - [growthSUD = (elapsedYearsSUD * aprSUD) / SUD.fromInt(1,d)](contracts/src/abstracts/InvestUpgradeable.sol#L273) +[LToken.setFund(address)](contracts/src/LToken.sol#L312-L318) should emit an event for: + - [fund = fund_](contracts/src/LToken.sol#L317) -contracts/src/abstracts/InvestUpgradeable.sol#L258-L279 +contracts/src/LToken.sol#L312-L318 -## incorrect-equality -Impact: Medium -Confidence: High +## events-maths +Impact: Low +Confidence: Medium - [ ] ID-2 -[InvestUpgradeable._beforeInvestmentChange(address,bool)](contracts/src/abstracts/InvestUpgradeable.sol#L409-L444) uses a dangerous strict equality: - - [accountsDetails[account].period.timestamp == uint40(block.timestamp)](contracts/src/abstracts/InvestUpgradeable.sol#L417) +[LToken.setRetentionRate(uint32)](contracts/src/LToken.sol#L283-L286) should emit an event for: + - [retentionRateUD7x3 = retentionRateUD7x3_](contracts/src/LToken.sol#L285) -contracts/src/abstracts/InvestUpgradeable.sol#L409-L444 +contracts/src/LToken.sol#L283-L286 -## write-after-write -Impact: Medium -Confidence: High - [ ] ID-3 -[InvestUpgradeable._isClaiming](contracts/src/abstracts/InvestUpgradeable.sol#L88) is written in both - [_isClaiming = true](contracts/src/abstracts/InvestUpgradeable.sol#L434) - [_isClaiming = false](contracts/src/abstracts/InvestUpgradeable.sol#L436) +[LToken.setFeesRate(uint32)](contracts/src/LToken.sol#L272-L275) should emit an event for: + - [feesRateUD7x3 = feesRateUD7x3_](contracts/src/LToken.sol#L274) -contracts/src/abstracts/InvestUpgradeable.sol#L88 +contracts/src/LToken.sol#L272-L275 -## events-access -Impact: Low -Confidence: Medium - [ ] ID-4 -[LToken.setWithdrawer(address)](contracts/src/LToken.sol#L296-L302) should emit an event for: - - [withdrawer = withdrawer_](contracts/src/LToken.sol#L301) +[LDYStaking.notifyRewardAmount(uint256)](contracts/src/LDYStaking.sol#L258-L283) should emit an event for: + - [rewardRatePerSec = amount / rewardsDuration](contracts/src/LDYStaking.sol#L265) + - [rewardRatePerSec = (amount + remainingRewards) / rewardsDuration](contracts/src/LDYStaking.sol#L268) -contracts/src/LToken.sol#L296-L302 +contracts/src/LDYStaking.sol#L258-L283 +## calls-loop +Impact: Low +Confidence: Medium - [ ] ID-5 -[LToken.setFund(address)](contracts/src/LToken.sol#L308-L314) should emit an event for: - - [fund = fund_](contracts/src/LToken.sol#L313) +[LToken.getWithdrawnAmountAndFees(address,uint256)](contracts/src/LToken.sol#L603-L621) has external calls inside a loop: [ldyStaking.tierOf(account) >= 2](contracts/src/LToken.sol#L608) -contracts/src/LToken.sol#L308-L314 +contracts/src/LToken.sol#L603-L621 -## events-maths +## reentrancy-events Impact: Low Confidence: Medium - [ ] ID-6 -[LToken.setRetentionRate(uint32)](contracts/src/LToken.sol#L279-L282) should emit an event for: - - [retentionRateUD7x3 = retentionRateUD7x3_](contracts/src/LToken.sol#L281) +Reentrancy in [LToken.processQueuedRequests()](contracts/src/LToken.sol#L740-L851): + External calls: + - [underlying().safeTransfer(request.account,withdrawnAmount)](contracts/src/LToken.sol#L829) + Event emitted after the call(s): + - [ActivityEvent(int256(nextRequestId),_msgSender(),Action.Withdraw,request.amount,request.amount,Status.Moved,int256(withdrawalQueue.length))](contracts/src/LToken.sol#L777-L785) + - [ActivityEvent(int256(nextRequestId),request.account,Action.Withdraw,request.amount,withdrawnAmount,Status.Success,NO_ID)](contracts/src/LToken.sol#L810-L818) -contracts/src/LToken.sol#L279-L282 +contracts/src/LToken.sol#L740-L851 +## timestamp +Impact: Low +Confidence: Medium - [ ] ID-7 -[LToken.setFeesRate(uint32)](contracts/src/LToken.sol#L269-L271) should emit an event for: - - [feesRateUD7x3 = feesRateUD7x3_](contracts/src/LToken.sol#L270) +[LDYStaking.unstake(uint256,uint256)](contracts/src/LDYStaking.sol#L187-L226) uses timestamp for comparisons + Dangerous comparisons: + - [require(bool,string)(block.timestamp >= userStakingInfo[_msgSender()][stakeIndex].unStakeAt,not allowed unstaking in the staking period)](contracts/src/LDYStaking.sol#L193-L196) -contracts/src/LToken.sol#L269-L271 +contracts/src/LDYStaking.sol#L187-L226 -## calls-loop -Impact: Low -Confidence: Medium - [ ] ID-8 -[GlobalRestrictableUpgradeable.isBlacklisted(address)](contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L68-L70) has external calls inside a loop: [_globalBlacklist.isBlacklisted(account)](contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L69) +[LDYStaking._min(uint256,uint256)](contracts/src/LDYStaking.sol#L380-L382) uses timestamp for comparisons + Dangerous comparisons: + - [x <= y](contracts/src/LDYStaking.sol#L381) -contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L68-L70 +contracts/src/LDYStaking.sol#L380-L382 - [ ] ID-9 -[SUD.decimalsOf(address)](contracts/src/libs/SUD.sol#L82-L84) has external calls inside a loop: [IERC20MetadataUpgradeable(tokenAddress).decimals()](contracts/src/libs/SUD.sol#L83) +[LDYStaking.setRewardsDuration(uint256)](contracts/src/LDYStaking.sol#L248-L251) uses timestamp for comparisons + Dangerous comparisons: + - [require(bool,string)(finishAt < block.timestamp,reward duration is not finished)](contracts/src/LDYStaking.sol#L249) -contracts/src/libs/SUD.sol#L82-L84 +contracts/src/LDYStaking.sol#L248-L251 - [ ] ID-10 -[LToken.getWithdrawnAmountAndFees(address,uint256)](contracts/src/LToken.sol#L599-L617) has external calls inside a loop: [ldyStaking.tierOf(account) >= 2](contracts/src/LToken.sol#L604) +[LDYStaking.notifyRewardAmount(uint256)](contracts/src/LDYStaking.sol#L258-L283) uses timestamp for comparisons + Dangerous comparisons: + - [block.timestamp >= finishAt](contracts/src/LDYStaking.sol#L264) + - [require(bool,string)(rewardRatePerSec > 0,reward rate = 0)](contracts/src/LDYStaking.sol#L271) + - [require(bool,string)(rewardRatePerSec <= (stakeRewardToken.balanceOf(address(this)) + amount - totalStaked) / rewardsDuration,reward amount > balance)](contracts/src/LDYStaking.sol#L272-L277) -contracts/src/LToken.sol#L599-L617 +contracts/src/LDYStaking.sol#L258-L283 -## reentrancy-events -Impact: Low +## costly-loop +Impact: Informational Confidence: Medium - [ ] ID-11 -Reentrancy in [LToken.processQueuedRequests()](contracts/src/LToken.sol#L736-L847): - External calls: - - [underlying().safeTransfer(request.account,withdrawnAmount)](contracts/src/LToken.sol#L825) - Event emitted after the call(s): - - [ActivityEvent(int256(nextRequestId),_msgSender(),Action.Withdraw,request.amount,request.amount,Status.Moved,int256(withdrawalQueue.length))](contracts/src/LToken.sol#L773-L781) - - [ActivityEvent(int256(nextRequestId),request.account,Action.Withdraw,request.amount,withdrawnAmount,Status.Success,NO_ID)](contracts/src/LToken.sol#L806-L814) +[LToken.processQueuedRequests()](contracts/src/LToken.sol#L740-L851) has costly operations inside a loop: + - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L767) -contracts/src/LToken.sol#L736-L847 +contracts/src/LToken.sol#L740-L851 -## timestamp -Impact: Low -Confidence: Medium - [ ] ID-12 -[InvestUpgradeable._beforeInvestmentChange(address,bool)](contracts/src/abstracts/InvestUpgradeable.sol#L409-L444) uses timestamp for comparisons - Dangerous comparisons: - - [accountsDetails[account].period.timestamp == uint40(block.timestamp)](contracts/src/abstracts/InvestUpgradeable.sol#L417) +[LToken.processQueuedRequests()](contracts/src/LToken.sol#L740-L851) has costly operations inside a loop: + - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L821) -contracts/src/abstracts/InvestUpgradeable.sol#L409-L444 +contracts/src/LToken.sol#L740-L851 -## boolean-equal -Impact: Informational -Confidence: High - [ ] ID-13 -[GlobalRestrictableUpgradeable.notBlacklisted(address)](contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L58-L61) compares to a boolean constant: - -[require(bool,string)(isBlacklisted(account) == false,L9)](contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L59) +[LToken.processQueuedRequests()](contracts/src/LToken.sol#L740-L851) has costly operations inside a loop: + - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L788) -contracts/src/abstracts/GlobalRestrictableUpgradeable.sol#L58-L61 +contracts/src/LToken.sol#L740-L851 -## costly-loop +## low-level-calls Impact: Informational -Confidence: Medium +Confidence: High - [ ] ID-14 -[LToken.processQueuedRequests()](contracts/src/LToken.sol#L736-L847) has costly operations inside a loop: - - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L784) - -contracts/src/LToken.sol#L736-L847 - - - - [ ] ID-15 -[LToken.processQueuedRequests()](contracts/src/LToken.sol#L736-L847) has costly operations inside a loop: - - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L763) - -contracts/src/LToken.sol#L736-L847 - - - - [ ] ID-16 -[LToken.processQueuedRequests()](contracts/src/LToken.sol#L736-L847) has costly operations inside a loop: - - [delete withdrawalQueue[nextRequestId]](contracts/src/LToken.sol#L817) - -contracts/src/LToken.sol#L736-L847 - - -## dead-code -Impact: Informational -Confidence: Medium - - [ ] ID-17 -[SUD.toInt(uint256,uint256)](contracts/src/libs/SUD.sol#L162-L168) is never used and should be removed - -contracts/src/libs/SUD.sol#L162-L168 +Low level call in [LToken.requestWithdrawal(uint256)](contracts/src/LToken.sol#L679-L733): + - [(sent) = withdrawer.call{value: msg.value}()](contracts/src/LToken.sol#L731) - - - [ ] ID-18 -[InvestUpgradeable._distributeRewards(address,uint256)](contracts/src/abstracts/InvestUpgradeable.sol#L241-L245) is never used and should be removed - -contracts/src/abstracts/InvestUpgradeable.sol#L241-L245 +contracts/src/LToken.sol#L679-L733 -## low-level-calls +## naming-convention Impact: Informational Confidence: High - - [ ] ID-19 -Low level call in [LToken.requestWithdrawal(uint256)](contracts/src/LToken.sol#L675-L729): - - [(sent) = withdrawer.call{value: msg.value}()](contracts/src/LToken.sol#L727) + - [ ] ID-15 +Constant [LToken.MAX_FEES_RATE_UD7x3](contracts/src/LToken.sol#L89) is not in UPPER_CASE_WITH_UNDERSCORES -contracts/src/LToken.sol#L675-L729 +contracts/src/LToken.sol#L89 ## redundant-statements Impact: Informational Confidence: High - - [ ] ID-20 -Redundant expression "[account](contracts/src/abstracts/InvestUpgradeable.sol#L242)" in[InvestUpgradeable](contracts/src/abstracts/InvestUpgradeable.sol#L50-L452) - -contracts/src/abstracts/InvestUpgradeable.sol#L242 - - - - [ ] ID-21 -Redundant expression "[account](contracts/src/LToken.sol#L559)" in[LToken](contracts/src/LToken.sol#L57-L1003) - -contracts/src/LToken.sol#L559 - - - - [ ] ID-22 -Redundant expression "[amount](contracts/src/LToken.sol#L560)" in[LToken](contracts/src/LToken.sol#L57-L1003) - -contracts/src/LToken.sol#L560 - - - - [ ] ID-23 -Redundant expression "[amount](contracts/src/LToken.sol#L549)" in[LToken](contracts/src/LToken.sol#L57-L1003) + - [ ] ID-16 +Redundant expression "[amount](contracts/src/LToken.sol#L553)" in[LToken](contracts/src/LToken.sol#L57-L1007) -contracts/src/LToken.sol#L549 +contracts/src/LToken.sol#L553 - - [ ] ID-24 -Redundant expression "[account](contracts/src/LToken.sol#L548)" in[LToken](contracts/src/LToken.sol#L57-L1003) + - [ ] ID-17 +Redundant expression "[account](contracts/src/LToken.sol#L563)" in[LToken](contracts/src/LToken.sol#L57-L1007) -contracts/src/LToken.sol#L548 +contracts/src/LToken.sol#L563 - - [ ] ID-25 -Redundant expression "[newOwner](contracts/src/abstracts/GlobalOwnableUpgradeable.sol#L70)" in[GlobalOwnableUpgradeable](contracts/src/abstracts/GlobalOwnableUpgradeable.sol#L24-L88) + - [ ] ID-18 +Redundant expression "[account](contracts/src/LToken.sol#L552)" in[LToken](contracts/src/LToken.sol#L57-L1007) -contracts/src/abstracts/GlobalOwnableUpgradeable.sol#L70 +contracts/src/LToken.sol#L552 - - [ ] ID-26 -Redundant expression "[amount](contracts/src/abstracts/InvestUpgradeable.sol#L243)" in[InvestUpgradeable](contracts/src/abstracts/InvestUpgradeable.sol#L50-L452) + - [ ] ID-19 +Redundant expression "[amount](contracts/src/LToken.sol#L564)" in[LToken](contracts/src/LToken.sol#L57-L1007) -contracts/src/abstracts/InvestUpgradeable.sol#L243 +contracts/src/LToken.sol#L564 diff --git a/src/generated.ts b/src/generated.ts index ffb8fdfa..d2945f64 100644 --- a/src/generated.ts +++ b/src/generated.ts @@ -205,6 +205,7 @@ export const genericErc20Abi = [ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ export const globalBlacklistAbi = [ @@ -399,6 +400,7 @@ export const globalBlacklistAbi = [ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ export const globalBlacklistAddress = { @@ -407,6 +409,7 @@ export const globalBlacklistAddress = { 42161: '0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350', 59140: '0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf', 59144: '0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350', + 84532: '0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd', 421613: '0x1549647606A71B2a79b85AEb54631b8eA2a1939a', } as const @@ -416,6 +419,7 @@ export const globalBlacklistAddress = { * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ export const globalBlacklistConfig = { @@ -433,6 +437,7 @@ export const globalBlacklistConfig = { * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ export const globalOwnerAbi = [ @@ -604,6 +609,7 @@ export const globalOwnerAbi = [ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ export const globalOwnerAddress = { @@ -612,6 +618,7 @@ export const globalOwnerAddress = { 42161: '0xe4Af4573bFc5F04D8b84c61744de8A94059f2462', 59140: '0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6', 59144: '0xe4Af4573bFc5F04D8b84c61744de8A94059f2462', + 84532: '0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3', 421613: '0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350', } as const @@ -621,6 +628,7 @@ export const globalOwnerAddress = { * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ export const globalOwnerConfig = { @@ -638,6 +646,7 @@ export const globalOwnerConfig = { * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ export const globalPauseAbi = [ @@ -832,6 +841,7 @@ export const globalPauseAbi = [ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ export const globalPauseAddress = { @@ -840,6 +850,7 @@ export const globalPauseAddress = { 42161: '0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB', 59140: '0x4fB551213757619558A93a599a08524e9Dd59C67', 59144: '0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB', + 84532: '0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE', 421613: '0x06f54B7f27eEC56616b951598BaA3B84D7660AB4', } as const @@ -849,6 +860,7 @@ export const globalPauseAddress = { * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ export const globalPauseConfig = { @@ -875,312 +887,303 @@ export const iTransfersListenerAbi = [ ] as const ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// LDYStaking +// LDY ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const ldyStakingAbi = [ +export const ldyAbi = [ + { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, { type: 'event', anonymous: false, inputs: [ { - name: 'previousOwner', + name: 'owner', internalType: 'address', type: 'address', indexed: true, }, { - name: 'newOwner', + name: 'spender', internalType: 'address', type: 'address', indexed: true, }, + { + name: 'value', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, ], - name: 'OwnershipTransferStarted', + name: 'Approval', }, { type: 'event', anonymous: false, inputs: [ + { name: 'from', internalType: 'address', type: 'address', indexed: true }, + { name: 'to', internalType: 'address', type: 'address', indexed: true }, { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, + name: 'value', + internalType: 'uint256', + type: 'uint256', + indexed: false, }, ], - name: 'OwnershipTransferred', + name: 'Transfer', }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [], - name: 'acceptOwnership', - outputs: [], + inputs: [ + { name: 'owner', internalType: 'address', type: 'address' }, + { name: 'spender', internalType: 'address', type: 'address' }, + ], + name: 'allowance', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'view', + stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'highTierAccounts', + inputs: [ + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'approve', outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + inputs: [{ name: 'account', internalType: 'address', type: 'address' }], + name: 'balanceOf', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'burn', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'account', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'burnFrom', + outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'pendingOwner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'decimals', + outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], + inputs: [ + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'subtractedValue', internalType: 'uint256', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'account', internalType: 'address', type: 'address' }, - { name: 'status', internalType: 'bool', type: 'bool' }, + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'addedValue', internalType: 'uint256', type: 'uint256' }, ], - name: 'setHighTierAccount', - outputs: [], + name: 'increaseAllowance', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'tierOf', - outputs: [{ name: 'tier', internalType: 'uint256', type: 'uint256' }], + inputs: [], + name: 'name', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'symbol', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'totalSupply', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], + inputs: [ + { name: 'to', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'from', internalType: 'address', type: 'address' }, + { name: 'to', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, ] as const /** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const ldyStakingAddress = { - 195: '0x045f9E9d2225319dF5E0909007FE7979E2674a32', - 31337: '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853', - 42161: '0x4e80beDBD58b084a8946b7BA6814c28906Be2d02', - 59140: '0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6', - 59144: '0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1', - 421613: '0x5BFFC5303719f0dC6050a2D8042936714109985f', +export const ldyAddress = { + 84532: '0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7', } as const +/** + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const ldyConfig = { address: ldyAddress, abi: ldyAbi } as const + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LDYStaking +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const ldyStakingConfig = { - address: ldyStakingAddress, - abi: ldyStakingAbi, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// LToken -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -export const lTokenAbi = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'newAPRUD7x3', - internalType: 'uint16', - type: 'uint16', - indexed: false, - }, - ], - name: 'APRChangeEvent', - }, +export const ldyStakingAbi = [ { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'constructor', inputs: [ - { name: 'id', internalType: 'int256', type: 'int256', indexed: true }, - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'action', - internalType: 'enum LToken.Action', - type: 'uint8', - indexed: true, - }, + { name: '_stakeRewardToken', internalType: 'address', type: 'address' }, + { name: '_stakeDurations', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'amount', + name: '_stakeDurationForPerks', internalType: 'uint256', type: 'uint256', - indexed: false, }, { - name: 'amountAfterFees', + name: '_stakeAmountForPerks', internalType: 'uint256', type: 'uint256', - indexed: false, - }, - { - name: 'newStatus', - internalType: 'enum LToken.Status', - type: 'uint8', - indexed: false, }, - { name: 'newId', internalType: 'int256', type: 'int256', indexed: false }, ], - name: 'ActivityEvent', }, { type: 'event', anonymous: false, inputs: [ { - name: 'previousAdmin', + name: 'previousOwner', internalType: 'address', type: 'address', - indexed: false, + indexed: true, }, { - name: 'newAdmin', + name: 'newOwner', internalType: 'address', type: 'address', - indexed: false, + indexed: true, }, ], - name: 'AdminChanged', + name: 'OwnershipTransferStarted', }, { type: 'event', anonymous: false, inputs: [ { - name: 'owner', + name: 'previousOwner', internalType: 'address', type: 'address', indexed: true, }, { - name: 'spender', + name: 'newOwner', internalType: 'address', type: 'address', indexed: true, }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, ], - name: 'Approval', + name: 'OwnershipTransferred', }, { type: 'event', anonymous: false, inputs: [ { - name: 'beacon', + name: 'account', internalType: 'address', type: 'address', - indexed: true, + indexed: false, }, ], - name: 'BeaconUpgraded', + name: 'Paused', }, { type: 'event', anonymous: false, inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, + { name: 'user', internalType: 'address', type: 'address', indexed: true }, + { + name: 'stakeNumber', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + { + name: 'reward', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, ], - name: 'Initialized', + name: 'RewardPaid', }, { type: 'event', anonymous: false, inputs: [ + { name: 'user', internalType: 'address', type: 'address', indexed: true }, { - name: 'account', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'balanceBefore', + name: 'stakeNumber', internalType: 'uint256', type: 'uint256', indexed: false, }, { - name: 'rewards', + name: 'amount', internalType: 'uint256', type: 'uint256', indexed: false, }, ], - name: 'MintedRewardsEvent', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', + name: 'Staked', }, { type: 'event', @@ -1193,374 +1196,259 @@ export const lTokenAbi = [ indexed: false, }, ], - name: 'Paused', + name: 'Unpaused', }, { type: 'event', anonymous: false, inputs: [ + { name: 'user', internalType: 'address', type: 'address', indexed: true }, { - name: 'newTVL', + name: 'stakeNumber', internalType: 'uint256', type: 'uint256', indexed: false, }, - ], - name: 'TVLChangeEvent', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, { - name: 'value', + name: 'amount', internalType: 'uint256', type: 'uint256', indexed: false, }, ], - name: 'Transfer', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Unpaused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'implementation', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'Upgraded', + name: 'Unstaked', }, { stateMutability: 'view', type: 'function', - inputs: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'spender', internalType: 'address', type: 'address' }, - ], - name: 'allowance', + inputs: [], + name: 'StakeAmountForPerks', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [ - { name: 'spender', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'approve', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + inputs: [], + name: 'StakeDurationForPerks', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'balanceOf', + inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'StakeDurations', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [{ name: 'requestId', internalType: 'uint256', type: 'uint256' }], - name: 'cancelWithdrawalRequest', - outputs: [], + inputs: [], + name: 'Token', + outputs: [{ name: '', internalType: 'contract IERC20', type: 'address' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [], - name: 'claimFees', + name: 'acceptOwnership', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'decimals', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', inputs: [ - { name: 'spender', internalType: 'address', type: 'address' }, - { name: 'subtractedValue', internalType: 'uint256', type: 'uint256' }, + { name: '_account', internalType: 'address', type: 'address' }, + { name: '_stakeNumber', internalType: 'uint256', type: 'uint256' }, ], - name: 'decreaseAllowance', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'earned', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], - name: 'deposit', - outputs: [], + inputs: [], + name: 'finishAt', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'pure', + stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'account', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, + { name: '_stakeNumber', internalType: 'uint256', type: 'uint256' }, ], - name: 'depositFor', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'feesRateUD7x3', - outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }], + name: 'getReward', + outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - name: 'frozenRequests', + inputs: [{ name: '_user', internalType: 'address', type: 'address' }], + name: 'getUserStakes', outputs: [ - { name: 'account', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint96', type: 'uint96' }, + { + name: '', + internalType: 'struct LDYStaking.StakingInfo[]', + type: 'tuple[]', + components: [ + { name: 'stakedAmount', internalType: 'uint256', type: 'uint256' }, + { name: 'unStakeAt', internalType: 'uint256', type: 'uint256' }, + { name: 'duration', internalType: 'uint256', type: 'uint256' }, + { + name: 'rewardPerTokenPaid', + internalType: 'uint256', + type: 'uint256', + }, + { name: 'rewards', internalType: 'uint256', type: 'uint256' }, + ], + }, ], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'fund', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + inputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'highTierAccounts', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'getAPR', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], + name: 'lastTimeRewardApplicable', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'getExpectedRetained', - outputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'lastUpdateTime', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'view', + stateMutability: 'nonpayable', type: 'function', - inputs: [ - { name: 'account', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getWithdrawnAmountAndFees', - outputs: [ - { name: 'withdrawnAmount', internalType: 'uint256', type: 'uint256' }, - { name: 'fees', internalType: 'uint256', type: 'uint256' }, - ], + inputs: [{ name: '_amount', internalType: 'uint256', type: 'uint256' }], + name: 'notifyRewardAmount', + outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'globalBlacklist', + name: 'owner', outputs: [{ name: '', internalType: 'address', type: 'address' }], }, { - stateMutability: 'view', + stateMutability: 'nonpayable', type: 'function', inputs: [], - name: 'globalOwner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'pause', + outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'globalPause', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'spender', internalType: 'address', type: 'address' }, - { name: 'addedValue', internalType: 'uint256', type: 'uint256' }, - ], - name: 'increaseAllowance', + name: 'paused', outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [ - { name: 'globalOwner_', internalType: 'address', type: 'address' }, - { name: 'globalPause_', internalType: 'address', type: 'address' }, - { name: 'globalBlacklist_', internalType: 'address', type: 'address' }, - { name: 'ldyStaking_', internalType: 'address', type: 'address' }, - { name: 'underlyingToken', internalType: 'address', type: 'address' }, - ], - name: 'initialize', - outputs: [], + inputs: [], + name: 'pendingOwner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], - name: 'instantWithdrawal', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', inputs: [], - name: 'invested', - outputs: [ - { name: '', internalType: 'contract IERC20Upgradeable', type: 'address' }, - ], + name: 'renounceOwnership', + outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'ldyStaking', - outputs: [ - { name: '', internalType: 'contract LDYStaking', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'listenerContract', internalType: 'address', type: 'address' }, - ], - name: 'listenToTransfers', - outputs: [], + name: 'rewardPerToken', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'name', - outputs: [{ name: '', internalType: 'string', type: 'string' }], + name: 'rewardPerTokenStored', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'rewardRatePerSec', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'rewardsDuration', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'requestId', internalType: 'uint256', type: 'uint256' }], - name: 'processBigQueuedRequest', + inputs: [{ name: '_duration', internalType: 'uint256', type: 'uint256' }], + name: 'setRewardsDuration', outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'processQueuedRequests', + inputs: [ + { name: '_amount', internalType: 'uint256', type: 'uint256' }, + { name: '_stakePeriodIndex', internalType: 'uint8', type: 'uint8' }, + ], + name: 'stake', outputs: [], }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'proxiableUUID', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, { stateMutability: 'view', type: 'function', inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'realBalanceOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'tierOf', + outputs: [{ name: 'tier', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'realTotalSupply', + name: 'totalStaked', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [ - { name: 'tokenAddress', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'recoverERC20', + inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], + name: 'transferOwnership', outputs: [], }, { stateMutability: 'nonpayable', type: 'function', inputs: [], - name: 'recoverUnderlying', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'renounceOwnership', + name: 'unpause', outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], - name: 'repatriate', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], - name: 'requestWithdrawal', + inputs: [ + { name: '_amount', internalType: 'uint256', type: 'uint256' }, + { name: '_stakeNumber', internalType: 'uint256', type: 'uint256' }, + ], + name: 'unstake', outputs: [], }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'retentionRateUD7x3', - outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'rewardsRedirectsFromTo', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, { stateMutability: 'view', type: 'function', @@ -1568,200 +1456,347 @@ export const lTokenAbi = [ { name: '', internalType: 'address', type: 'address' }, { name: '', internalType: 'uint256', type: 'uint256' }, ], - name: 'rewardsRedirectsToFrom', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'aprUD7x3', internalType: 'uint16', type: 'uint16' }], - name: 'setAPR', - outputs: [], + name: 'userStakingInfo', + outputs: [ + { name: 'stakedAmount', internalType: 'uint256', type: 'uint256' }, + { name: 'unStakeAt', internalType: 'uint256', type: 'uint256' }, + { name: 'duration', internalType: 'uint256', type: 'uint256' }, + { name: 'rewardPerTokenPaid', internalType: 'uint256', type: 'uint256' }, + { name: 'rewards', internalType: 'uint256', type: 'uint256' }, + ], }, +] as const + +/** + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const ldyStakingAddress = { + 195: '0x045f9E9d2225319dF5E0909007FE7979E2674a32', + 31337: '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853', + 42161: '0x4e80beDBD58b084a8946b7BA6814c28906Be2d02', + 59140: '0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6', + 59144: '0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1', + 84532: '0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b', + 421613: '0x5BFFC5303719f0dC6050a2D8042936714109985f', +} as const + +/** + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const ldyStakingConfig = { + address: ldyStakingAddress, + abi: ldyStakingAbi, +} as const + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LToken +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +export const lTokenAbi = [ { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'feesRateUD7x3_', internalType: 'uint32', type: 'uint32' }, + { + name: 'newAPRUD7x3', + internalType: 'uint16', + type: 'uint16', + indexed: false, + }, ], - name: 'setFeesRate', - outputs: [], + name: 'APRChangeEvent', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'fund_', internalType: 'address payable', type: 'address' }, + { name: 'id', internalType: 'int256', type: 'int256', indexed: true }, + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'action', + internalType: 'enum LToken.Action', + type: 'uint8', + indexed: true, + }, + { + name: 'amount', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + { + name: 'amountAfterFees', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + { + name: 'newStatus', + internalType: 'enum LToken.Status', + type: 'uint8', + indexed: false, + }, + { name: 'newId', internalType: 'int256', type: 'int256', indexed: false }, ], - name: 'setFund', - outputs: [], + name: 'ActivityEvent', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'ldyStakingAddress', internalType: 'address', type: 'address' }, + { + name: 'previousAdmin', + internalType: 'address', + type: 'address', + indexed: false, + }, + { + name: 'newAdmin', + internalType: 'address', + type: 'address', + indexed: false, + }, ], - name: 'setLDYStaking', - outputs: [], + name: 'AdminChanged', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'retentionRateUD7x3_', internalType: 'uint32', type: 'uint32' }, + { + name: 'owner', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'spender', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'value', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, ], - name: 'setRetentionRate', - outputs: [], + name: 'Approval', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'withdrawer_', internalType: 'address payable', type: 'address' }, + { + name: 'beacon', + internalType: 'address', + type: 'address', + indexed: true, + }, ], - name: 'setWithdrawer', - outputs: [], + name: 'BeaconUpgraded', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, + { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, ], - name: 'startRewardsRedirection', - outputs: [], + name: 'Initialized', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'balanceBefore', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + { + name: 'rewards', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, ], - name: 'stopRewardsRedirection', - outputs: [], + name: 'MintedRewardsEvent', }, { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'symbol', - outputs: [{ name: '', internalType: 'string', type: 'string' }], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'previousOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'newOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'OwnershipTransferred', }, { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalQueued', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalSupply', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: false, + }, ], - name: 'transfer', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'Paused', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, + { + name: 'newTVL', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, ], - name: 'transferFrom', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'TVLChangeEvent', }, { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], + type: 'event', + anonymous: false, + inputs: [ + { name: 'from', internalType: 'address', type: 'address', indexed: true }, + { name: 'to', internalType: 'address', type: 'address', indexed: true }, + { + name: 'value', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + ], + name: 'Transfer', }, { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - name: 'transfersListeners', - outputs: [ + type: 'event', + anonymous: false, + inputs: [ { - name: '', - internalType: 'contract ITransfersListener', + name: 'account', + internalType: 'address', type: 'address', + indexed: false, }, ], + name: 'Unpaused', }, { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unclaimedFees', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'implementation', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'Upgraded', }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'underlying', - outputs: [ - { name: '', internalType: 'contract IERC20Upgradeable', type: 'address' }, + inputs: [ + { name: 'owner', internalType: 'address', type: 'address' }, + { name: 'spender', internalType: 'address', type: 'address' }, ], + name: 'allowance', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'listenerContract', internalType: 'address', type: 'address' }, + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, ], - name: 'unlistenToTransfers', - outputs: [], + name: 'approve', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'view', type: 'function', inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'unmintedRewardsOf', + name: 'balanceOf', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [ - { name: 'newImplementation', internalType: 'address', type: 'address' }, - ], - name: 'upgradeTo', + inputs: [{ name: 'requestId', internalType: 'uint256', type: 'uint256' }], + name: 'cancelWithdrawalRequest', outputs: [], }, { - stateMutability: 'payable', + stateMutability: 'nonpayable', type: 'function', - inputs: [ - { name: 'newImplementation', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'upgradeToAndCall', + inputs: [], + name: 'claimFees', outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'usableUnderlyings', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'decimals', + outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'subtractedValue', internalType: 'uint256', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'deposit', + outputs: [], }, { stateMutability: 'pure', @@ -1770,14 +1805,21 @@ export const lTokenAbi = [ { name: 'account', internalType: 'address', type: 'address' }, { name: 'amount', internalType: 'uint256', type: 'uint256' }, ], - name: 'withdrawTo', + name: 'depositFor', outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'feesRateUD7x3', + outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }], + }, { stateMutability: 'view', type: 'function', inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - name: 'withdrawalQueue', + name: 'frozenRequests', outputs: [ { name: 'account', internalType: 'address', type: 'address' }, { name: 'amount', internalType: 'uint96', type: 'uint96' }, @@ -1787,133 +1829,121 @@ export const lTokenAbi = [ stateMutability: 'view', type: 'function', inputs: [], - name: 'withdrawalQueueCursor', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'fund', + outputs: [{ name: '', internalType: 'address', type: 'address' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'withdrawer', - outputs: [{ name: '', internalType: 'address payable', type: 'address' }], + name: 'getAPR', + outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], }, -] as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// LTokenSignaler -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) - */ -export const lTokenSignalerAbi = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousAdmin', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'newAdmin', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'AdminChanged', + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'getExpectedRetained', + outputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], }, { - type: 'event', - anonymous: false, + stateMutability: 'view', + type: 'function', inputs: [ - { - name: 'beacon', - internalType: 'address', - type: 'address', - indexed: true, - }, + { name: 'account', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'getWithdrawnAmountAndFees', + outputs: [ + { name: 'withdrawnAmount', internalType: 'uint256', type: 'uint256' }, + { name: 'fees', internalType: 'uint256', type: 'uint256' }, ], - name: 'BeaconUpgraded', }, { - type: 'event', - anonymous: false, + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'globalBlacklist', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'globalOwner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'globalPause', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, + { name: 'spender', internalType: 'address', type: 'address' }, + { name: 'addedValue', internalType: 'uint256', type: 'uint256' }, ], - name: 'Initialized', + name: 'increaseAllowance', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'lTokenAddress', - internalType: 'address', - type: 'address', - indexed: true, - }, + { name: 'globalOwner_', internalType: 'address', type: 'address' }, + { name: 'globalPause_', internalType: 'address', type: 'address' }, + { name: 'globalBlacklist_', internalType: 'address', type: 'address' }, + { name: 'ldyStaking_', internalType: 'address', type: 'address' }, + { name: 'underlyingToken', internalType: 'address', type: 'address' }, ], - name: 'LTokenSignalEvent', + name: 'initialize', + outputs: [], }, { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'instantWithdrawal', + outputs: [], }, { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'implementation', - internalType: 'address', - type: 'address', - indexed: true, - }, + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'invested', + outputs: [ + { name: '', internalType: 'contract IERC20Upgradeable', type: 'address' }, ], - name: 'Upgraded', }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'globalOwner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'ldyStaking', + outputs: [ + { name: '', internalType: 'contract LDYStaking', type: 'address' }, + ], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'globalOwner_', internalType: 'address', type: 'address' }, + { name: 'listenerContract', internalType: 'address', type: 'address' }, ], - name: 'initialize', + name: 'listenToTransfers', outputs: [], }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'name', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + }, { stateMutability: 'view', type: 'function', @@ -1921,6 +1951,27 @@ export const lTokenSignalerAbi = [ name: 'owner', outputs: [{ name: '', internalType: 'address', type: 'address' }], }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'paused', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'requestId', internalType: 'uint256', type: 'uint256' }], + name: 'processBigQueuedRequest', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'processQueuedRequests', + outputs: [], + }, { stateMutability: 'view', type: 'function', @@ -1928,2338 +1979,3648 @@ export const lTokenSignalerAbi = [ name: 'proxiableUUID', outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: 'account', internalType: 'address', type: 'address' }], + name: 'realBalanceOf', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'renounceOwnership', - outputs: [], + name: 'realTotalSupply', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'lTokenAddress', internalType: 'address', type: 'address' }, + { name: 'tokenAddress', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, ], - name: 'signalLToken', + name: 'recoverERC20', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'recoverUnderlying', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', + inputs: [], + name: 'renounceOwnership', outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [ - { name: 'newImplementation', internalType: 'address', type: 'address' }, - ], - name: 'upgradeTo', + inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'repatriate', outputs: [], }, { stateMutability: 'payable', type: 'function', + inputs: [{ name: 'amount', internalType: 'uint256', type: 'uint256' }], + name: 'requestWithdrawal', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'retentionRateUD7x3', + outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'rewardsRedirectsFromTo', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', inputs: [ - { name: 'newImplementation', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, + { name: '', internalType: 'address', type: 'address' }, + { name: '', internalType: 'uint256', type: 'uint256' }, ], - name: 'upgradeToAndCall', + name: 'rewardsRedirectsToFrom', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'aprUD7x3', internalType: 'uint16', type: 'uint16' }], + name: 'setAPR', outputs: [], }, -] as const - -/** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) - */ -export const lTokenSignalerAddress = { - 195: '0x6A88b87aA4865e8d67D7CD32178bA03F885a088a', - 31337: '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0', - 42161: '0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1', - 59140: '0x04a678103bE57c3d81100fe08e43C94e50adC37B', - 59144: '0xBA427517505b14C560854aED003304Fc69cbadfb', - 421613: '0x1dA817E33C0dB209C7b508B79F9dac4480f94522', -} as const - -/** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) - */ -export const lTokenSignalerConfig = { - address: lTokenSignalerAddress, - abi: lTokenSignalerAbi, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PreMining -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) - */ -export const preMiningAbi = [ { stateMutability: 'nonpayable', - type: 'constructor', + type: 'function', inputs: [ - { name: 'lTokenAddress_', internalType: 'address', type: 'address' }, - { name: 'maxDistributedLDY_', internalType: 'uint256', type: 'uint256' }, - { name: 'lockedHardCap_', internalType: 'uint256', type: 'uint256' }, - { name: 'minLockDuration_', internalType: 'uint8', type: 'uint8' }, - { name: 'maxLockDuration_', internalType: 'uint8', type: 'uint8' }, - { name: 'vestingDuration_', internalType: 'uint8', type: 'uint8' }, + { name: 'feesRateUD7x3_', internalType: 'uint32', type: 'uint32' }, ], + name: 'setFeesRate', + outputs: [], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'duration', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, + { name: 'fund_', internalType: 'address payable', type: 'address' }, ], - name: 'Lock', + name: 'setFund', + outputs: [], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, + { name: 'ldyStakingAddress', internalType: 'address', type: 'address' }, ], - name: 'OwnershipTransferStarted', + name: 'setLDYStaking', + outputs: [], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, + { name: 'retentionRateUD7x3_', internalType: 'uint32', type: 'uint32' }, ], - name: 'OwnershipTransferred', + name: 'setRetentionRate', + outputs: [], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, + { name: 'withdrawer_', internalType: 'address payable', type: 'address' }, ], - name: 'Paused', + name: 'setWithdrawer', + outputs: [], }, { - type: 'event', - anonymous: false, + stateMutability: 'nonpayable', + type: 'function', inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, + { name: 'from', internalType: 'address', type: 'address' }, + { name: 'to', internalType: 'address', type: 'address' }, ], - name: 'Unpaused', + name: 'startRewardsRedirection', + outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'acceptOwnership', + inputs: [ + { name: 'from', internalType: 'address', type: 'address' }, + { name: 'to', internalType: 'address', type: 'address' }, + ], + name: 'stopRewardsRedirection', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'accountsLocks', - outputs: [ - { name: 'amount', internalType: 'uint240', type: 'uint240' }, - { name: 'duration', internalType: 'uint8', type: 'uint8' }, - { name: 'hasUnlocked', internalType: 'bool', type: 'bool' }, - { name: 'claimedRewards', internalType: 'uint216', type: 'uint216' }, - { name: 'lockEndTimestamp', internalType: 'uint40', type: 'uint40' }, - ], + inputs: [], + name: 'symbol', + outputs: [{ name: '', internalType: 'string', type: 'string' }], }, { stateMutability: 'view', type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'availableToClaim', + inputs: [], + name: 'totalQueued', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'claimPhaseStartTimestamp', + name: 'totalSupply', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'claimRewards', - outputs: [], + inputs: [ + { name: 'to', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { - stateMutability: 'view', + stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'eligibleRewardsOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + inputs: [ + { name: 'from', internalType: 'address', type: 'address' }, + { name: 'to', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', - inputs: [], - name: 'endDepositPhase', + inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], + name: 'transferOwnership', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'hasClaimPhaseStarted', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'transfersListeners', + outputs: [ + { + name: '', + internalType: 'contract ITransfersListener', + type: 'address', + }, + ], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'hasDepositPhaseEnded', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'unclaimedFees', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'hasRecoveryPhaseStarted', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + name: 'underlying', + outputs: [ + { name: '', internalType: 'contract IERC20Upgradeable', type: 'address' }, + ], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'instantUnlock', + inputs: [ + { name: 'listenerContract', internalType: 'address', type: 'address' }, + ], + name: 'unlistenToTransfers', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'lToken', - outputs: [{ name: '', internalType: 'contract LToken', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ldyToken', - outputs: [{ name: '', internalType: 'contract IERC20', type: 'address' }], + inputs: [{ name: 'account', internalType: 'address', type: 'address' }], + name: 'unmintedRewardsOf', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'amount', internalType: 'uint256', type: 'uint256' }, - { name: 'duration', internalType: 'uint8', type: 'uint8' }, + { name: 'newImplementation', internalType: 'address', type: 'address' }, ], - name: 'lock', + name: 'upgradeTo', outputs: [], }, { - stateMutability: 'view', + stateMutability: 'payable', type: 'function', - inputs: [], - name: 'lockedHardCap', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + inputs: [ + { name: 'newImplementation', internalType: 'address', type: 'address' }, + { name: 'data', internalType: 'bytes', type: 'bytes' }, + ], + name: 'upgradeToAndCall', + outputs: [], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'maxDistributedLDY', + name: 'usableUnderlyings', outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { - stateMutability: 'view', + stateMutability: 'pure', type: 'function', - inputs: [], - name: 'maxLockDuration', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + inputs: [ + { name: 'account', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'withdrawTo', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'maxWeight', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'withdrawalQueue', + outputs: [ + { name: 'account', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint96', type: 'uint96' }, + ], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'minLockDuration', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + name: 'withdrawalQueueCursor', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'withdrawer', + outputs: [{ name: '', internalType: 'address payable', type: 'address' }], }, +] as const + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LTokenSignaler +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + */ +export const lTokenSignalerAbi = [ + { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'pause', - outputs: [], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'previousAdmin', + internalType: 'address', + type: 'address', + indexed: false, + }, + { + name: 'newAdmin', + internalType: 'address', + type: 'address', + indexed: false, + }, + ], + name: 'AdminChanged', }, { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'beacon', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'BeaconUpgraded', }, { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'pendingOwner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], + type: 'event', + anonymous: false, + inputs: [ + { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, + ], + name: 'Initialized', }, { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'processUnlockRequests', - outputs: [], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'lTokenAddress', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'LTokenSignalEvent', }, { - stateMutability: 'nonpayable', - type: 'function', + type: 'event', + anonymous: false, inputs: [ - { name: 'tokenAddress', internalType: 'address', type: 'address' }, - { name: 'amount', internalType: 'uint256', type: 'uint256' }, + { + name: 'previousOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'newOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, ], - name: 'recoverERC20', - outputs: [], + name: 'OwnershipTransferred', }, { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], + type: 'event', + anonymous: false, + inputs: [ + { + name: 'implementation', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'Upgraded', }, { - stateMutability: 'payable', + stateMutability: 'view', type: 'function', inputs: [], - name: 'requestUnlock', - outputs: [], + name: 'globalOwner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], }, { stateMutability: 'nonpayable', type: 'function', inputs: [ - { name: 'ldyTokenAddress', internalType: 'address', type: 'address' }, + { name: 'globalOwner_', internalType: 'address', type: 'address' }, ], - name: 'setLDYToken', + name: 'initialize', outputs: [], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', inputs: [], - name: 'startClaimPhase', - outputs: [], + name: 'owner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], }, { - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', inputs: [], - name: 'startRecoveryPhase', - outputs: [], + name: 'proxiableUUID', + outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], }, { stateMutability: 'view', type: 'function', inputs: [], - name: 'totalLocked', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'renounceOwnership', + outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', + inputs: [ + { name: 'lTokenAddress', internalType: 'address', type: 'address' }, + ], + name: 'signalLToken', outputs: [], }, { stateMutability: 'view', type: 'function', - inputs: [], - name: 'underlyingToken', - outputs: [{ name: '', internalType: 'contract IERC20', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - name: 'unlockRequests', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unlockRequestsCursor', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], + name: 'transferOwnership', + outputs: [], }, { stateMutability: 'nonpayable', type: 'function', - inputs: [], - name: 'unpause', + inputs: [ + { name: 'newImplementation', internalType: 'address', type: 'address' }, + ], + name: 'upgradeTo', outputs: [], }, { - stateMutability: 'view', + stateMutability: 'payable', type: 'function', - inputs: [], - name: 'vestingDuration', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + inputs: [ + { name: 'newImplementation', internalType: 'address', type: 'address' }, + { name: 'data', internalType: 'bytes', type: 'bytes' }, + ], + name: 'upgradeToAndCall', + outputs: [], }, ] as const /** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const preMiningAddress = { - 195: '0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9', - 31337: '0x9A676e781A523b5d0C0e43731313A708CB607508', - 42161: '0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c', - 59144: '0xd54d564606611A3502FE8909bBD3075dbeb77813', +export const lTokenSignalerAddress = { + 195: '0x6A88b87aA4865e8d67D7CD32178bA03F885a088a', + 31337: '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0', + 42161: '0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1', + 59140: '0x04a678103bE57c3d81100fe08e43C94e50adC37B', + 59144: '0xBA427517505b14C560854aED003304Fc69cbadfb', + 84532: '0x0772879C3025451A3AE88478044E4eF7bEe2F832', + 421613: '0x1dA817E33C0dB209C7b508B79F9dac4480f94522', } as const /** - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const preMiningConfig = { - address: preMiningAddress, - abi: preMiningAbi, +export const lTokenSignalerConfig = { + address: lTokenSignalerAddress, + abi: lTokenSignalerAbi, } as const ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// React +// PreMining ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ - */ -export const useReadGenericErc20 = /*#__PURE__*/ createUseReadContract({ - abi: genericErc20Abi, -}) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"allowance"` - */ -export const useReadGenericErc20Allowance = /*#__PURE__*/ createUseReadContract( - { abi: genericErc20Abi, functionName: 'allowance' }, -) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"balanceOf"` - */ -export const useReadGenericErc20BalanceOf = /*#__PURE__*/ createUseReadContract( - { abi: genericErc20Abi, functionName: 'balanceOf' }, -) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decimals"` - */ -export const useReadGenericErc20Decimals = /*#__PURE__*/ createUseReadContract({ - abi: genericErc20Abi, - functionName: 'decimals', -}) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"name"` + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadGenericErc20Name = /*#__PURE__*/ createUseReadContract({ - abi: genericErc20Abi, - functionName: 'name', -}) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"symbol"` +export const preMiningAbi = [ + { + stateMutability: 'nonpayable', + type: 'constructor', + inputs: [ + { name: 'lTokenAddress_', internalType: 'address', type: 'address' }, + { name: 'maxDistributedLDY_', internalType: 'uint256', type: 'uint256' }, + { name: 'lockedHardCap_', internalType: 'uint256', type: 'uint256' }, + { name: 'minLockDuration_', internalType: 'uint8', type: 'uint8' }, + { name: 'maxLockDuration_', internalType: 'uint8', type: 'uint8' }, + { name: 'vestingDuration_', internalType: 'uint8', type: 'uint8' }, + ], + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'amount', + internalType: 'uint256', + type: 'uint256', + indexed: false, + }, + { + name: 'duration', + internalType: 'uint8', + type: 'uint8', + indexed: false, + }, + ], + name: 'Lock', + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'previousOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'newOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'OwnershipTransferStarted', + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'previousOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'newOwner', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'OwnershipTransferred', + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: false, + }, + ], + name: 'Paused', + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'account', + internalType: 'address', + type: 'address', + indexed: false, + }, + ], + name: 'Unpaused', + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'acceptOwnership', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'accountsLocks', + outputs: [ + { name: 'amount', internalType: 'uint240', type: 'uint240' }, + { name: 'duration', internalType: 'uint8', type: 'uint8' }, + { name: 'hasUnlocked', internalType: 'bool', type: 'bool' }, + { name: 'claimedRewards', internalType: 'uint216', type: 'uint216' }, + { name: 'lockEndTimestamp', internalType: 'uint40', type: 'uint40' }, + ], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: 'account', internalType: 'address', type: 'address' }], + name: 'availableToClaim', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'claimPhaseStartTimestamp', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'claimRewards', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: 'account', internalType: 'address', type: 'address' }], + name: 'eligibleRewardsOf', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'endDepositPhase', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'hasClaimPhaseStarted', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'hasDepositPhaseEnded', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'hasRecoveryPhaseStarted', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'instantUnlock', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'lToken', + outputs: [{ name: '', internalType: 'contract LToken', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'ldyToken', + outputs: [{ name: '', internalType: 'contract IERC20', type: 'address' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + { name: 'duration', internalType: 'uint8', type: 'uint8' }, + ], + name: 'lock', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'lockedHardCap', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'maxDistributedLDY', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'maxLockDuration', + outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'maxWeight', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'minLockDuration', + outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'owner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'pause', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'paused', + outputs: [{ name: '', internalType: 'bool', type: 'bool' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'pendingOwner', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'processUnlockRequests', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'tokenAddress', internalType: 'address', type: 'address' }, + { name: 'amount', internalType: 'uint256', type: 'uint256' }, + ], + name: 'recoverERC20', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'renounceOwnership', + outputs: [], + }, + { + stateMutability: 'payable', + type: 'function', + inputs: [], + name: 'requestUnlock', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [ + { name: 'ldyTokenAddress', internalType: 'address', type: 'address' }, + ], + name: 'setLDYToken', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'startClaimPhase', + outputs: [], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'startRecoveryPhase', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'totalLocked', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], + name: 'transferOwnership', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'underlyingToken', + outputs: [{ name: '', internalType: 'contract IERC20', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + name: 'unlockRequests', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'unlockRequestsCursor', + outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], + }, + { + stateMutability: 'nonpayable', + type: 'function', + inputs: [], + name: 'unpause', + outputs: [], + }, + { + stateMutability: 'view', + type: 'function', + inputs: [], + name: 'vestingDuration', + outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], + }, +] as const + +/** + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const preMiningAddress = { + 195: '0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9', + 42161: '0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c', + 59144: '0xd54d564606611A3502FE8909bBD3075dbeb77813', +} as const + +/** + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const preMiningConfig = { + address: preMiningAddress, + abi: preMiningAbi, +} as const + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// React +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const useReadGenericErc20 = /*#__PURE__*/ createUseReadContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"allowance"` + */ +export const useReadGenericErc20Allowance = /*#__PURE__*/ createUseReadContract( + { abi: genericErc20Abi, functionName: 'allowance' }, +) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"balanceOf"` + */ +export const useReadGenericErc20BalanceOf = /*#__PURE__*/ createUseReadContract( + { abi: genericErc20Abi, functionName: 'balanceOf' }, +) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decimals"` + */ +export const useReadGenericErc20Decimals = /*#__PURE__*/ createUseReadContract({ + abi: genericErc20Abi, + functionName: 'decimals', +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"name"` + */ +export const useReadGenericErc20Name = /*#__PURE__*/ createUseReadContract({ + abi: genericErc20Abi, + functionName: 'name', +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"symbol"` + */ +export const useReadGenericErc20Symbol = /*#__PURE__*/ createUseReadContract({ + abi: genericErc20Abi, + functionName: 'symbol', +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"totalSupply"` + */ +export const useReadGenericErc20TotalSupply = + /*#__PURE__*/ createUseReadContract({ + abi: genericErc20Abi, + functionName: 'totalSupply', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const useWriteGenericErc20 = /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + */ +export const useWriteGenericErc20Approve = /*#__PURE__*/ createUseWriteContract( + { abi: genericErc20Abi, functionName: 'approve' }, +) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + */ +export const useWriteGenericErc20Burn = /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'burn', +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + */ +export const useWriteGenericErc20BurnFrom = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'burnFrom', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + */ +export const useWriteGenericErc20DecreaseAllowance = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'decreaseAllowance', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + */ +export const useWriteGenericErc20IncreaseAllowance = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'increaseAllowance', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` + */ +export const useWriteGenericErc20Mint = /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'mint', +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + */ +export const useWriteGenericErc20SetDecimals = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'setDecimals', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + */ +export const useWriteGenericErc20Transfer = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'transfer', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + */ +export const useWriteGenericErc20TransferFrom = + /*#__PURE__*/ createUseWriteContract({ + abi: genericErc20Abi, + functionName: 'transferFrom', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const useSimulateGenericErc20 = /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + */ +export const useSimulateGenericErc20Approve = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'approve', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + */ +export const useSimulateGenericErc20Burn = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'burn', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + */ +export const useSimulateGenericErc20BurnFrom = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'burnFrom', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + */ +export const useSimulateGenericErc20DecreaseAllowance = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'decreaseAllowance', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + */ +export const useSimulateGenericErc20IncreaseAllowance = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'increaseAllowance', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` + */ +export const useSimulateGenericErc20Mint = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'mint', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + */ +export const useSimulateGenericErc20SetDecimals = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'setDecimals', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + */ +export const useSimulateGenericErc20Transfer = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'transfer', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + */ +export const useSimulateGenericErc20TransferFrom = + /*#__PURE__*/ createUseSimulateContract({ + abi: genericErc20Abi, + functionName: 'transferFrom', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const useWatchGenericErc20Event = + /*#__PURE__*/ createUseWatchContractEvent({ abi: genericErc20Abi }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Approval"` + */ +export const useWatchGenericErc20ApprovalEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: genericErc20Abi, + eventName: 'Approval', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Transfer"` + */ +export const useWatchGenericErc20TransferEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: genericErc20Abi, + eventName: 'Transfer', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklist = /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"globalOwner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistGlobalOwner = + /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'globalOwner', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"isBlacklisted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistIsBlacklisted = + /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'isBlacklisted', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"owner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistOwner = /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'owner', +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"proxiableUUID"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistProxiableUuid = + /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'proxiableUUID', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistRenounceOwnership = + /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'renounceOwnership', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useReadGlobalBlacklistTransferOwnership = + /*#__PURE__*/ createUseReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'transferOwnership', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklist = /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklistBlacklist = + /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'blacklist', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklistInitialize = + /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'initialize', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklistUnBlacklist = + /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'unBlacklist', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklistUpgradeTo = + /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeTo', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWriteGlobalBlacklistUpgradeToAndCall = + /*#__PURE__*/ createUseWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeToAndCall', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklist = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklistBlacklist = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'blacklist', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklistInitialize = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'initialize', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklistUnBlacklist = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'unBlacklist', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklistUpgradeTo = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeTo', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useSimulateGlobalBlacklistUpgradeToAndCall = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeToAndCall', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"AdminChanged"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistAdminChangedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'AdminChanged', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"BeaconUpgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistBeaconUpgradedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'BeaconUpgraded', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Blacklisted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistBlacklistedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Blacklisted', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Initialized"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistInitializedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Initialized', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"OwnershipTransferred"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistOwnershipTransferredEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'OwnershipTransferred', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Unblacklisted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistUnblacklistedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Unblacklisted', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Upgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + */ +export const useWatchGlobalBlacklistUpgradedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Upgraded', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + */ +export const useReadGlobalOwner = /*#__PURE__*/ createUseReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, +}) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"owner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useReadGenericErc20Symbol = /*#__PURE__*/ createUseReadContract({ - abi: genericErc20Abi, - functionName: 'symbol', +export const useReadGlobalOwnerOwner = /*#__PURE__*/ createUseReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'owner', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"totalSupply"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"pendingOwner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useReadGenericErc20TotalSupply = +export const useReadGlobalOwnerPendingOwner = /*#__PURE__*/ createUseReadContract({ - abi: genericErc20Abi, - functionName: 'totalSupply', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'pendingOwner', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ - */ -export const useWriteGenericErc20 = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, -}) - -/** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"proxiableUUID"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20Approve = /*#__PURE__*/ createUseWriteContract( - { abi: genericErc20Abi, functionName: 'approve' }, -) +export const useReadGlobalOwnerProxiableUuid = + /*#__PURE__*/ createUseReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'proxiableUUID', + }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20Burn = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'burn', +export const useWriteGlobalOwner = /*#__PURE__*/ createUseWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20BurnFrom = +export const useWriteGlobalOwnerAcceptOwnership = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'burnFrom', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'acceptOwnership', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20DecreaseAllowance = +export const useWriteGlobalOwnerInitialize = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'decreaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20IncreaseAllowance = +export const useWriteGlobalOwnerRenounceOwnership = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'increaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` - */ -export const useWriteGenericErc20Mint = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'mint', -}) - -/** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20SetDecimals = +export const useWriteGlobalOwnerTransferOwnership = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'setDecimals', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20Transfer = +export const useWriteGlobalOwnerUpgradeTo = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'transfer', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWriteGenericErc20TransferFrom = +export const useWriteGlobalOwnerUpgradeToAndCall = /*#__PURE__*/ createUseWriteContract({ - abi: genericErc20Abi, - functionName: 'transferFrom', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20 = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, +export const useSimulateGlobalOwner = /*#__PURE__*/ createUseSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20Approve = +export const useSimulateGlobalOwnerAcceptOwnership = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'approve', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'acceptOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20Burn = +export const useSimulateGlobalOwnerInitialize = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'burn', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20BurnFrom = +export const useSimulateGlobalOwnerRenounceOwnership = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'burnFrom', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + */ +export const useSimulateGlobalOwnerTransferOwnership = + /*#__PURE__*/ createUseSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'transferOwnership', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20DecreaseAllowance = +export const useSimulateGlobalOwnerUpgradeTo = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'decreaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20IncreaseAllowance = +export const useSimulateGlobalOwnerUpgradeToAndCall = /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'increaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20Mint = - /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'mint', +export const useWatchGlobalOwnerEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"AdminChanged"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20SetDecimals = - /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'setDecimals', +export const useWatchGlobalOwnerAdminChangedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'AdminChanged', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20Transfer = - /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'transfer', +export const useWatchGlobalOwnerBeaconUpgradedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Initialized"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useSimulateGenericErc20TransferFrom = - /*#__PURE__*/ createUseSimulateContract({ - abi: genericErc20Abi, - functionName: 'transferFrom', +export const useWatchGlobalOwnerInitializedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWatchGenericErc20Event = - /*#__PURE__*/ createUseWatchContractEvent({ abi: genericErc20Abi }) +export const useWatchGlobalOwnerOwnershipTransferStartedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'OwnershipTransferStarted', + }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Approval"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWatchGenericErc20ApprovalEvent = +export const useWatchGlobalOwnerOwnershipTransferredEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: genericErc20Abi, - eventName: 'Approval', + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Transfer"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Upgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const useWatchGenericErc20TransferEvent = +export const useWatchGlobalOwnerUpgradedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: genericErc20Abi, - eventName: 'Transfer', + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'Upgraded', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklist = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const useReadGlobalPause = /*#__PURE__*/ createUseReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"globalOwner"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"globalOwner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistGlobalOwner = +export const useReadGlobalPauseGlobalOwner = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'globalOwner', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"isBlacklisted"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistIsBlacklisted = - /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'isBlacklisted', - }) +export const useReadGlobalPauseOwner = /*#__PURE__*/ createUseReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'owner', +}) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistOwner = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'owner', +export const useReadGlobalPausePaused = /*#__PURE__*/ createUseReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'paused', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"proxiableUUID"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"proxiableUUID"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistProxiableUuid = +export const useReadGlobalPauseProxiableUuid = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'proxiableUUID', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"renounceOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistRenounceOwnership = +export const useReadGlobalPauseRenounceOwnership = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'renounceOwnership', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"transferOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useReadGlobalBlacklistTransferOwnership = +export const useReadGlobalPauseTransferOwnership = /*#__PURE__*/ createUseReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'transferOwnership', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklist = /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const useWriteGlobalPause = /*#__PURE__*/ createUseWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklistBlacklist = +export const useWriteGlobalPauseInitialize = /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'blacklist', + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklistInitialize = - /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'initialize', - }) +export const useWriteGlobalPausePause = /*#__PURE__*/ createUseWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'pause', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklistUnBlacklist = - /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'unBlacklist', - }) +export const useWriteGlobalPauseUnpause = /*#__PURE__*/ createUseWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'unpause', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklistUpgradeTo = +export const useWriteGlobalPauseUpgradeTo = /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeTo', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWriteGlobalBlacklistUpgradeToAndCall = +export const useWriteGlobalPauseUpgradeToAndCall = /*#__PURE__*/ createUseWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklist = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - }) +export const useSimulateGlobalPause = /*#__PURE__*/ createUseSimulateContract({ + abi: globalPauseAbi, + address: globalPauseAddress, +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklistBlacklist = +export const useSimulateGlobalPauseInitialize = /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'blacklist', + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklistInitialize = +export const useSimulateGlobalPausePause = /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'initialize', + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'pause', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklistUnBlacklist = +export const useSimulateGlobalPauseUnpause = /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'unBlacklist', + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'unpause', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklistUpgradeTo = +export const useSimulateGlobalPauseUpgradeTo = /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeTo', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useSimulateGlobalBlacklistUpgradeToAndCall = +export const useSimulateGlobalPauseUpgradeToAndCall = /*#__PURE__*/ createUseSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistEvent = +export const useWatchGlobalPauseEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"AdminChanged"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistAdminChangedEvent = +export const useWatchGlobalPauseAdminChangedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'AdminChanged', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"BeaconUpgraded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistBeaconUpgradedEvent = +export const useWatchGlobalPauseBeaconUpgradedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Blacklisted"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Initialized"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistBlacklistedEvent = +export const useWatchGlobalPauseInitializedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Blacklisted', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"OwnershipTransferred"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistInitializedEvent = +export const useWatchGlobalPauseOwnershipTransferredEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Initialized', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistOwnershipTransferredEvent = +export const useWatchGlobalPausePausedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'OwnershipTransferred', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Paused', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Unblacklisted"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Unpaused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistUnblacklistedEvent = +export const useWatchGlobalPauseUnpausedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Unblacklisted', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Unpaused', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Upgraded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const useWatchGlobalBlacklistUpgradedEvent = +export const useWatchGlobalPauseUpgradedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'Upgraded', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - */ -export const useReadGlobalOwner = /*#__PURE__*/ createUseReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, -}) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"owner"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ */ -export const useReadGlobalOwnerOwner = /*#__PURE__*/ createUseReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'owner', +export const useWriteITransfersListener = /*#__PURE__*/ createUseWriteContract({ + abi: iTransfersListenerAbi, }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"pendingOwner"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - */ -export const useReadGlobalOwnerPendingOwner = - /*#__PURE__*/ createUseReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'pendingOwner', - }) - -/** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"proxiableUUID"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` */ -export const useReadGlobalOwnerProxiableUuid = - /*#__PURE__*/ createUseReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'proxiableUUID', +export const useWriteITransfersListenerOnLTokenTransfer = + /*#__PURE__*/ createUseWriteContract({ + abi: iTransfersListenerAbi, + functionName: 'onLTokenTransfer', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ */ -export const useWriteGlobalOwner = /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, -}) +export const useSimulateITransfersListener = + /*#__PURE__*/ createUseSimulateContract({ abi: iTransfersListenerAbi }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` */ -export const useWriteGlobalOwnerAcceptOwnership = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'acceptOwnership', +export const useSimulateITransfersListenerOnLTokenTransfer = + /*#__PURE__*/ createUseSimulateContract({ + abi: iTransfersListenerAbi, + functionName: 'onLTokenTransfer', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWriteGlobalOwnerInitialize = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'initialize', - }) +export const useReadLdy = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"allowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWriteGlobalOwnerRenounceOwnership = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'renounceOwnership', - }) +export const useReadLdyAllowance = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'allowance', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"balanceOf"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWriteGlobalOwnerTransferOwnership = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'transferOwnership', - }) +export const useReadLdyBalanceOf = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'balanceOf', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decimals"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWriteGlobalOwnerUpgradeTo = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeTo', - }) +export const useReadLdyDecimals = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decimals', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"name"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWriteGlobalOwnerUpgradeToAndCall = - /*#__PURE__*/ createUseWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeToAndCall', - }) +export const useReadLdyName = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'name', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"symbol"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwner = /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const useReadLdySymbol = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'symbol', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"totalSupply"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerAcceptOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'acceptOwnership', - }) +export const useReadLdyTotalSupply = /*#__PURE__*/ createUseReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'totalSupply', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerInitialize = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'initialize', - }) +export const useWriteLdy = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"approve"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerRenounceOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'renounceOwnership', - }) +export const useWriteLdyApprove = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'approve', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burn"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerTransferOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'transferOwnership', - }) +export const useWriteLdyBurn = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burn', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burnFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerUpgradeTo = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeTo', - }) +export const useWriteLdyBurnFrom = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burnFrom', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decreaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useSimulateGlobalOwnerUpgradeToAndCall = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeToAndCall', +export const useWriteLdyDecreaseAllowance = + /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decreaseAllowance', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"increaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const useWriteLdyIncreaseAllowance = + /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'increaseAllowance', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transfer"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerAdminChangedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'AdminChanged', - }) +export const useWriteLdyTransfer = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transfer', +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transferFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerBeaconUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'BeaconUpgraded', - }) +export const useWriteLdyTransferFrom = /*#__PURE__*/ createUseWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transferFrom', +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerInitializedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'Initialized', - }) +export const useSimulateLdy = /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"approve"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerOwnershipTransferStartedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'OwnershipTransferStarted', - }) +export const useSimulateLdyApprove = /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'approve', +}) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burn"` + * + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const useSimulateLdyBurn = /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burn', +}) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burnFrom"` + * + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const useSimulateLdyBurnFrom = /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burnFrom', +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decreaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerOwnershipTransferredEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'OwnershipTransferred', +export const useSimulateLdyDecreaseAllowance = + /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decreaseAllowance', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"increaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useWatchGlobalOwnerUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'Upgraded', +export const useSimulateLdyIncreaseAllowance = + /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'increaseAllowance', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transfer"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useReadGlobalPause = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const useSimulateLdyTransfer = /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transfer', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"globalOwner"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transferFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useReadGlobalPauseGlobalOwner = - /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'globalOwner', +export const useSimulateLdyTransferFrom = + /*#__PURE__*/ createUseSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transferFrom', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const useReadGlobalPauseOwner = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'owner', +export const useWatchLdyEvent = /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"paused"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyAbi}__ and `eventName` set to `"Approval"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const useWatchLdyApprovalEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, + eventName: 'Approval', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyAbi}__ and `eventName` set to `"Transfer"` + * + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const useWatchLdyTransferEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, + eventName: 'Transfer', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadGlobalPausePaused = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'paused', +export const useReadLdyStaking = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"proxiableUUID"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeAmountForPerks"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadGlobalPauseProxiableUuid = +export const useReadLdyStakingStakeAmountForPerks = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'proxiableUUID', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeAmountForPerks', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeDurationForPerks"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadGlobalPauseRenounceOwnership = +export const useReadLdyStakingStakeDurationForPerks = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'renounceOwnership', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeDurationForPerks', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeDurations"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadGlobalPauseTransferOwnership = +export const useReadLdyStakingStakeDurations = /*#__PURE__*/ createUseReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'transferOwnership', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeDurations', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"Token"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPause = /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const useReadLdyStakingToken = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'Token', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"earned"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPauseInitialize = - /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'initialize', - }) +export const useReadLdyStakingEarned = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'earned', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"finishAt"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPausePause = /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'pause', +export const useReadLdyStakingFinishAt = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'finishAt', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getUserStakes"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPauseUnpause = /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'unpause', -}) +export const useReadLdyStakingGetUserStakes = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'getUserStakes', + }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"highTierAccounts"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPauseUpgradeTo = - /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeTo', +export const useReadLdyStakingHighTierAccounts = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'highTierAccounts', + }) + +/** + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"lastTimeRewardApplicable"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useReadLdyStakingLastTimeRewardApplicable = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'lastTimeRewardApplicable', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"lastUpdateTime"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteGlobalPauseUpgradeToAndCall = - /*#__PURE__*/ createUseWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeToAndCall', +export const useReadLdyStakingLastUpdateTime = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'lastUpdateTime', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPause = /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const useReadLdyStakingOwner = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'owner', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPauseInitialize = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'initialize', - }) +export const useReadLdyStakingPaused = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'paused', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pendingOwner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPausePause = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'pause', +export const useReadLdyStakingPendingOwner = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'pendingOwner', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardPerToken"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPauseUnpause = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'unpause', +export const useReadLdyStakingRewardPerToken = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardPerToken', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardPerTokenStored"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPauseUpgradeTo = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeTo', +export const useReadLdyStakingRewardPerTokenStored = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardPerTokenStored', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardRatePerSec"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateGlobalPauseUpgradeToAndCall = - /*#__PURE__*/ createUseSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeToAndCall', +export const useReadLdyStakingRewardRatePerSec = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardRatePerSec', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardsDuration"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const useReadLdyStakingRewardsDuration = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardsDuration', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"tierOf"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseAdminChangedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'AdminChanged', - }) +export const useReadLdyStakingTierOf = /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'tierOf', +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"totalStaked"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseBeaconUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'BeaconUpgraded', - }) +export const useReadLdyStakingTotalStaked = /*#__PURE__*/ createUseReadContract( + { + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'totalStaked', + }, +) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"userStakingInfo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseInitializedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Initialized', +export const useReadLdyStakingUserStakingInfo = + /*#__PURE__*/ createUseReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'userStakingInfo', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseOwnershipTransferredEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'OwnershipTransferred', - }) +export const useWriteLdyStaking = /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Paused"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPausePausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Paused', +export const useWriteLdyStakingAcceptOwnership = + /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'acceptOwnership', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Unpaused"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getReward"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseUnpausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Unpaused', - }) +export const useWriteLdyStakingGetReward = /*#__PURE__*/ createUseWriteContract( + { abi: ldyStakingAbi, address: ldyStakingAddress, functionName: 'getReward' }, +) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"notifyRewardAmount"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchGlobalPauseUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Upgraded', +export const useWriteLdyStakingNotifyRewardAmount = + /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'notifyRewardAmount', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pause"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteITransfersListener = /*#__PURE__*/ createUseWriteContract({ - abi: iTransfersListenerAbi, +export const useWriteLdyStakingPause = /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'pause', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteITransfersListenerOnLTokenTransfer = +export const useWriteLdyStakingRenounceOwnership = /*#__PURE__*/ createUseWriteContract({ - abi: iTransfersListenerAbi, - functionName: 'onLTokenTransfer', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ - */ -export const useSimulateITransfersListener = - /*#__PURE__*/ createUseSimulateContract({ abi: iTransfersListenerAbi }) - -/** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setRewardsDuration"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateITransfersListenerOnLTokenTransfer = - /*#__PURE__*/ createUseSimulateContract({ - abi: iTransfersListenerAbi, - functionName: 'onLTokenTransfer', +export const useWriteLdyStakingSetRewardsDuration = + /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'setRewardsDuration', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"stake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadLdyStaking = /*#__PURE__*/ createUseReadContract({ +export const useWriteLdyStakingStake = /*#__PURE__*/ createUseWriteContract({ abi: ldyStakingAbi, address: ldyStakingAddress, + functionName: 'stake', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"highTierAccounts"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadLdyStakingHighTierAccounts = - /*#__PURE__*/ createUseReadContract({ +export const useWriteLdyStakingTransferOwnership = + /*#__PURE__*/ createUseWriteContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'highTierAccounts', + functionName: 'transferOwnership', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadLdyStakingOwner = /*#__PURE__*/ createUseReadContract({ +export const useWriteLdyStakingUnpause = /*#__PURE__*/ createUseWriteContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'owner', + functionName: 'unpause', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pendingOwner"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unstake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadLdyStakingPendingOwner = - /*#__PURE__*/ createUseReadContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, - functionName: 'pendingOwner', - }) +export const useWriteLdyStakingUnstake = /*#__PURE__*/ createUseWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'unstake', +}) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"tierOf"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useReadLdyStakingTierOf = /*#__PURE__*/ createUseReadContract({ +export const useSimulateLdyStaking = /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'tierOf', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteLdyStaking = /*#__PURE__*/ createUseWriteContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, -}) +export const useSimulateLdyStakingAcceptOwnership = + /*#__PURE__*/ createUseSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'acceptOwnership', + }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getReward"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteLdyStakingAcceptOwnership = - /*#__PURE__*/ createUseWriteContract({ +export const useSimulateLdyStakingGetReward = + /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'acceptOwnership', + functionName: 'getReward', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"notifyRewardAmount"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteLdyStakingRenounceOwnership = - /*#__PURE__*/ createUseWriteContract({ +export const useSimulateLdyStakingNotifyRewardAmount = + /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'renounceOwnership', + functionName: 'notifyRewardAmount', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setHighTierAccount"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteLdyStakingSetHighTierAccount = - /*#__PURE__*/ createUseWriteContract({ +export const useSimulateLdyStakingPause = + /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'setHighTierAccount', + functionName: 'pause', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWriteLdyStakingTransferOwnership = - /*#__PURE__*/ createUseWriteContract({ +export const useSimulateLdyStakingRenounceOwnership = + /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'transferOwnership', + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setRewardsDuration"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateLdyStaking = /*#__PURE__*/ createUseSimulateContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, -}) +export const useSimulateLdyStakingSetRewardsDuration = + /*#__PURE__*/ createUseSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'setRewardsDuration', + }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"stake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateLdyStakingAcceptOwnership = +export const useSimulateLdyStakingStake = /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'acceptOwnership', + functionName: 'stake', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateLdyStakingRenounceOwnership = +export const useSimulateLdyStakingTransferOwnership = /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'renounceOwnership', + functionName: 'transferOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setHighTierAccount"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateLdyStakingSetHighTierAccount = +export const useSimulateLdyStakingUnpause = /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'setHighTierAccount', + functionName: 'unpause', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unstake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useSimulateLdyStakingTransferOwnership = +export const useSimulateLdyStakingUnstake = /*#__PURE__*/ createUseSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'transferOwnership', + functionName: 'unstake', }) /** @@ -4270,6 +5631,7 @@ export const useSimulateLdyStakingTransferOwnership = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ export const useWatchLdyStakingEvent = @@ -4286,6 +5648,7 @@ export const useWatchLdyStakingEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ export const useWatchLdyStakingOwnershipTransferStartedEvent = @@ -4296,20 +5659,111 @@ export const useWatchLdyStakingOwnershipTransferStartedEvent = }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferred"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useWatchLdyStakingOwnershipTransferredEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'OwnershipTransferred', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Paused"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useWatchLdyStakingPausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'Paused', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"RewardPaid"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useWatchLdyStakingRewardPaidEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'RewardPaid', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Staked"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useWatchLdyStakingStakedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'Staked', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Unpaused"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const useWatchLdyStakingUnpausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'Unpaused', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Unstaked"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const useWatchLdyStakingOwnershipTransferredEvent = +export const useWatchLdyStakingUnstakedEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - eventName: 'OwnershipTransferred', + eventName: 'Unstaked', }) /** @@ -4916,3493 +6370,4406 @@ export const useSimulateLTokenDecreaseAllowance = }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"deposit"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"deposit"` + */ +export const useSimulateLTokenDeposit = /*#__PURE__*/ createUseSimulateContract( + { abi: lTokenAbi, functionName: 'deposit' }, +) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"increaseAllowance"` + */ +export const useSimulateLTokenIncreaseAllowance = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'increaseAllowance', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"initialize"` + */ +export const useSimulateLTokenInitialize = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'initialize', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"instantWithdrawal"` + */ +export const useSimulateLTokenInstantWithdrawal = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'instantWithdrawal', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"listenToTransfers"` + */ +export const useSimulateLTokenListenToTransfers = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'listenToTransfers', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"processBigQueuedRequest"` + */ +export const useSimulateLTokenProcessBigQueuedRequest = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'processBigQueuedRequest', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"processQueuedRequests"` + */ +export const useSimulateLTokenProcessQueuedRequests = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'processQueuedRequests', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"recoverERC20"` + */ +export const useSimulateLTokenRecoverErc20 = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'recoverERC20', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"recoverUnderlying"` + */ +export const useSimulateLTokenRecoverUnderlying = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'recoverUnderlying', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"repatriate"` + */ +export const useSimulateLTokenRepatriate = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'repatriate', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"requestWithdrawal"` + */ +export const useSimulateLTokenRequestWithdrawal = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'requestWithdrawal', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setAPR"` + */ +export const useSimulateLTokenSetApr = /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'setAPR', +}) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setFeesRate"` + */ +export const useSimulateLTokenSetFeesRate = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'setFeesRate', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setFund"` + */ +export const useSimulateLTokenSetFund = /*#__PURE__*/ createUseSimulateContract( + { abi: lTokenAbi, functionName: 'setFund' }, +) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setLDYStaking"` + */ +export const useSimulateLTokenSetLdyStaking = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'setLDYStaking', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setRetentionRate"` + */ +export const useSimulateLTokenSetRetentionRate = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'setRetentionRate', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setWithdrawer"` + */ +export const useSimulateLTokenSetWithdrawer = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'setWithdrawer', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"startRewardsRedirection"` + */ +export const useSimulateLTokenStartRewardsRedirection = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'startRewardsRedirection', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"stopRewardsRedirection"` + */ +export const useSimulateLTokenStopRewardsRedirection = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'stopRewardsRedirection', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"transfer"` + */ +export const useSimulateLTokenTransfer = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'transfer', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"transferFrom"` + */ +export const useSimulateLTokenTransferFrom = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'transferFrom', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"unlistenToTransfers"` + */ +export const useSimulateLTokenUnlistenToTransfers = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'unlistenToTransfers', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"upgradeTo"` + */ +export const useSimulateLTokenUpgradeTo = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'upgradeTo', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"upgradeToAndCall"` + */ +export const useSimulateLTokenUpgradeToAndCall = + /*#__PURE__*/ createUseSimulateContract({ + abi: lTokenAbi, + functionName: 'upgradeToAndCall', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ + */ +export const useWatchLTokenEvent = /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, +}) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"APRChangeEvent"` + */ +export const useWatchLTokenAprChangeEventEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, + eventName: 'APRChangeEvent', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"ActivityEvent"` + */ +export const useWatchLTokenActivityEventEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, + eventName: 'ActivityEvent', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"AdminChanged"` + */ +export const useWatchLTokenAdminChangedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, + eventName: 'AdminChanged', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Approval"` + */ +export const useWatchLTokenApprovalEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, + eventName: 'Approval', + }) + +/** + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"BeaconUpgraded"` */ -export const useSimulateLTokenDeposit = /*#__PURE__*/ createUseSimulateContract( - { abi: lTokenAbi, functionName: 'deposit' }, -) +export const useWatchLTokenBeaconUpgradedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: lTokenAbi, + eventName: 'BeaconUpgraded', + }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"increaseAllowance"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Initialized"` */ -export const useSimulateLTokenIncreaseAllowance = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenInitializedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'increaseAllowance', + eventName: 'Initialized', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"MintedRewardsEvent"` */ -export const useSimulateLTokenInitialize = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenMintedRewardsEventEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'initialize', + eventName: 'MintedRewardsEvent', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"instantWithdrawal"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"OwnershipTransferred"` */ -export const useSimulateLTokenInstantWithdrawal = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenOwnershipTransferredEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'instantWithdrawal', + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"listenToTransfers"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Paused"` */ -export const useSimulateLTokenListenToTransfers = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenPausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'listenToTransfers', + eventName: 'Paused', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"processBigQueuedRequest"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"TVLChangeEvent"` */ -export const useSimulateLTokenProcessBigQueuedRequest = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenTvlChangeEventEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'processBigQueuedRequest', + eventName: 'TVLChangeEvent', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"processQueuedRequests"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Transfer"` */ -export const useSimulateLTokenProcessQueuedRequests = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenTransferEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'processQueuedRequests', + eventName: 'Transfer', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"recoverERC20"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Unpaused"` */ -export const useSimulateLTokenRecoverErc20 = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenUnpausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'recoverERC20', + eventName: 'Unpaused', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"recoverUnderlying"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Upgraded"` */ -export const useSimulateLTokenRecoverUnderlying = - /*#__PURE__*/ createUseSimulateContract({ +export const useWatchLTokenUpgradedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: lTokenAbi, - functionName: 'recoverUnderlying', + eventName: 'Upgraded', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"repatriate"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenRepatriate = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'repatriate', - }) +export const useReadLTokenSignaler = /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"requestWithdrawal"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"globalOwner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenRequestWithdrawal = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'requestWithdrawal', +export const useReadLTokenSignalerGlobalOwner = + /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'globalOwner', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setAPR"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"owner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetApr = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'setAPR', +export const useReadLTokenSignalerOwner = /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'owner', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setFeesRate"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"proxiableUUID"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetFeesRate = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'setFeesRate', +export const useReadLTokenSignalerProxiableUuid = + /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'proxiableUUID', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setFund"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetFund = /*#__PURE__*/ createUseSimulateContract( - { abi: lTokenAbi, functionName: 'setFund' }, -) +export const useReadLTokenSignalerRenounceOwnership = + /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'renounceOwnership', + }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setLDYStaking"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetLdyStaking = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'setLDYStaking', +export const useReadLTokenSignalerTransferOwnership = + /*#__PURE__*/ createUseReadContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setRetentionRate"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetRetentionRate = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'setRetentionRate', +export const useWriteLTokenSignaler = /*#__PURE__*/ createUseWriteContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + */ +export const useWriteLTokenSignalerInitialize = + /*#__PURE__*/ createUseWriteContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"setWithdrawer"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"signalLToken"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenSetWithdrawer = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'setWithdrawer', +export const useWriteLTokenSignalerSignalLToken = + /*#__PURE__*/ createUseWriteContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'signalLToken', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"startRewardsRedirection"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenStartRewardsRedirection = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'startRewardsRedirection', +export const useWriteLTokenSignalerUpgradeTo = + /*#__PURE__*/ createUseWriteContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"stopRewardsRedirection"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenStopRewardsRedirection = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'stopRewardsRedirection', +export const useWriteLTokenSignalerUpgradeToAndCall = + /*#__PURE__*/ createUseWriteContract({ + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"transfer"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenTransfer = +export const useSimulateLTokenSignaler = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'transfer', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"transferFrom"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenTransferFrom = +export const useSimulateLTokenSignalerInitialize = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'transferFrom', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"unlistenToTransfers"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"signalLToken"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenUnlistenToTransfers = +export const useSimulateLTokenSignalerSignalLToken = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, - functionName: 'unlistenToTransfers', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + functionName: 'signalLToken', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenUpgradeTo = +export const useSimulateLTokenSignalerUpgradeTo = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, functionName: 'upgradeTo', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useSimulateLTokenUpgradeToAndCall = +export const useSimulateLTokenSignalerUpgradeToAndCall = /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenAbi, + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ - */ -export const useWatchLTokenEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, -}) - -/** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"APRChangeEvent"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenAprChangeEventEvent = +export const useWatchLTokenSignalerEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'APRChangeEvent', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"ActivityEvent"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"AdminChanged"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenActivityEventEvent = +export const useWatchLTokenSignalerAdminChangedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'ActivityEvent', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'AdminChanged', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenAdminChangedEvent = +export const useWatchLTokenSignalerBeaconUpgradedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'AdminChanged', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Approval"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"Initialized"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenApprovalEvent = +export const useWatchLTokenSignalerInitializedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Approval', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"LTokenSignalEvent"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenBeaconUpgradedEvent = +export const useWatchLTokenSignalerLTokenSignalEventEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'BeaconUpgraded', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'LTokenSignalEvent', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenInitializedEvent = +export const useWatchLTokenSignalerOwnershipTransferredEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Initialized', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"MintedRewardsEvent"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"Upgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ -export const useWatchLTokenMintedRewardsEventEvent = +export const useWatchLTokenSignalerUpgradedEvent = /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'MintedRewardsEvent', + abi: lTokenSignalerAbi, + address: lTokenSignalerAddress, + eventName: 'Upgraded', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenOwnershipTransferredEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'OwnershipTransferred', - }) +export const useReadPreMining = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Paused"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"accountsLocks"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenPausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Paused', +export const useReadPreMiningAccountsLocks = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'accountsLocks', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"TVLChangeEvent"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"availableToClaim"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenTvlChangeEventEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'TVLChangeEvent', +export const useReadPreMiningAvailableToClaim = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'availableToClaim', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Transfer"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimPhaseStartTimestamp"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenTransferEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Transfer', +export const useReadPreMiningClaimPhaseStartTimestamp = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'claimPhaseStartTimestamp', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Unpaused"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"eligibleRewardsOf"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenUnpausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Unpaused', +export const useReadPreMiningEligibleRewardsOf = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'eligibleRewardsOf', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasClaimPhaseStarted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenAbi, - eventName: 'Upgraded', +export const useReadPreMiningHasClaimPhaseStarted = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'hasClaimPhaseStarted', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasDepositPhaseEnded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignaler = /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, -}) +export const useReadPreMiningHasDepositPhaseEnded = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'hasDepositPhaseEnded', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"globalOwner"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasRecoveryPhaseStarted"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignalerGlobalOwner = +export const useReadPreMiningHasRecoveryPhaseStarted = /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'globalOwner', + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'hasRecoveryPhaseStarted', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lToken"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignalerOwner = /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'owner', +export const useReadPreMiningLToken = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'lToken', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"proxiableUUID"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"ldyToken"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignalerProxiableUuid = - /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'proxiableUUID', - }) +export const useReadPreMiningLdyToken = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'ldyToken', +}) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lockedHardCap"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignalerRenounceOwnership = +export const useReadPreMiningLockedHardCap = /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'renounceOwnership', + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'lockedHardCap', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxDistributedLDY"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadLTokenSignalerTransferOwnership = +export const useReadPreMiningMaxDistributedLdy = /*#__PURE__*/ createUseReadContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'transferOwnership', + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'maxDistributedLDY', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) - */ -export const useWriteLTokenSignaler = /*#__PURE__*/ createUseWriteContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, -}) - -/** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxLockDuration"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWriteLTokenSignalerInitialize = - /*#__PURE__*/ createUseWriteContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'initialize', +export const useReadPreMiningMaxLockDuration = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'maxLockDuration', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"signalLToken"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxWeight"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWriteLTokenSignalerSignalLToken = - /*#__PURE__*/ createUseWriteContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'signalLToken', - }) +export const useReadPreMiningMaxWeight = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'maxWeight', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"minLockDuration"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWriteLTokenSignalerUpgradeTo = - /*#__PURE__*/ createUseWriteContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'upgradeTo', +export const useReadPreMiningMinLockDuration = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'minLockDuration', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWriteLTokenSignalerUpgradeToAndCall = - /*#__PURE__*/ createUseWriteContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'upgradeToAndCall', - }) +export const useReadPreMiningOwner = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'owner', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useSimulateLTokenSignaler = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - }) +export const useReadPreMiningPaused = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'paused', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pendingOwner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useSimulateLTokenSignalerInitialize = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'initialize', - }) +export const useReadPreMiningPendingOwner = /*#__PURE__*/ createUseReadContract( + { + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'pendingOwner', + }, +) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"signalLToken"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"totalLocked"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useSimulateLTokenSignalerSignalLToken = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'signalLToken', - }) +export const useReadPreMiningTotalLocked = /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'totalLocked', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"underlyingToken"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useSimulateLTokenSignalerUpgradeTo = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'upgradeTo', +export const useReadPreMiningUnderlyingToken = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'underlyingToken', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequests"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useSimulateLTokenSignalerUpgradeToAndCall = - /*#__PURE__*/ createUseSimulateContract({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - functionName: 'upgradeToAndCall', +export const useReadPreMiningUnlockRequests = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'unlockRequests', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequestsCursor"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, +export const useReadPreMiningUnlockRequestsCursor = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'unlockRequestsCursor', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"vestingDuration"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerAdminChangedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'AdminChanged', +export const useReadPreMiningVestingDuration = + /*#__PURE__*/ createUseReadContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'vestingDuration', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerBeaconUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'BeaconUpgraded', - }) +export const useWritePreMining = /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, +}) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerInitializedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'Initialized', +export const useWritePreMiningAcceptOwnership = + /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'acceptOwnership', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"LTokenSignalEvent"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerLTokenSignalEventEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'LTokenSignalEvent', +export const useWritePreMiningClaimRewards = + /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'claimRewards', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerOwnershipTransferredEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'OwnershipTransferred', +export const useWritePreMiningEndDepositPhase = + /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'endDepositPhase', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link lTokenSignalerAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x6A88b87aA4865e8d67D7CD32178bA03F885a088a) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWatchLTokenSignalerUpgradedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: lTokenSignalerAbi, - address: lTokenSignalerAddress, - eventName: 'Upgraded', +export const useWritePreMiningInstantUnlock = + /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'instantUnlock', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMining = /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningLock = /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, + functionName: 'lock', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"accountsLocks"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningAccountsLocks = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningPause = /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'pause', +}) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useWritePreMiningProcessUnlockRequests = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'accountsLocks', + functionName: 'processUnlockRequests', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"availableToClaim"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningAvailableToClaim = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningRecoverErc20 = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'availableToClaim', + functionName: 'recoverERC20', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimPhaseStartTimestamp"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningClaimPhaseStartTimestamp = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningRenounceOwnership = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'claimPhaseStartTimestamp', + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"eligibleRewardsOf"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningEligibleRewardsOf = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningRequestUnlock = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'eligibleRewardsOf', + functionName: 'requestUnlock', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasClaimPhaseStarted"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningHasClaimPhaseStarted = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningSetLdyToken = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'hasClaimPhaseStarted', + functionName: 'setLDYToken', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasDepositPhaseEnded"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningHasDepositPhaseEnded = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningStartClaimPhase = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'hasDepositPhaseEnded', + functionName: 'startClaimPhase', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasRecoveryPhaseStarted"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningHasRecoveryPhaseStarted = - /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningStartRecoveryPhase = + /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'hasRecoveryPhaseStarted', + functionName: 'startRecoveryPhase', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lToken"` + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningLToken = /*#__PURE__*/ createUseReadContract({ +export const useWritePreMiningTransferOwnership = + /*#__PURE__*/ createUseWriteContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'transferOwnership', + }) + +/** + * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useWritePreMiningUnpause = /*#__PURE__*/ createUseWriteContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'lToken', + functionName: 'unpause', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"ldyToken"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningLdyToken = /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMining = /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'ldyToken', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lockedHardCap"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningLockedHardCap = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningAcceptOwnership = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'lockedHardCap', + functionName: 'acceptOwnership', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxDistributedLDY"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningMaxDistributedLdy = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningClaimRewards = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'maxDistributedLDY', + functionName: 'claimRewards', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxLockDuration"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningMaxLockDuration = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningEndDepositPhase = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'maxLockDuration', + functionName: 'endDepositPhase', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxWeight"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningMaxWeight = /*#__PURE__*/ createUseReadContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'maxWeight', -}) +export const useSimulatePreMiningInstantUnlock = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'instantUnlock', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"minLockDuration"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningMinLockDuration = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningLock = /*#__PURE__*/ createUseSimulateContract( + { abi: preMiningAbi, address: preMiningAddress, functionName: 'lock' }, +) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useSimulatePreMiningPause = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'minLockDuration', + functionName: 'pause', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningOwner = /*#__PURE__*/ createUseReadContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'owner', -}) +export const useSimulatePreMiningProcessUnlockRequests = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'processUnlockRequests', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"paused"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningPaused = /*#__PURE__*/ createUseReadContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'paused', -}) +export const useSimulatePreMiningRecoverErc20 = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'recoverERC20', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pendingOwner"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningPendingOwner = /*#__PURE__*/ createUseReadContract( - { +export const useSimulatePreMiningRenounceOwnership = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'pendingOwner', - }, -) + functionName: 'renounceOwnership', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"totalLocked"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useSimulatePreMiningRequestUnlock = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'requestUnlock', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useSimulatePreMiningSetLdyToken = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'setLDYToken', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + */ +export const useSimulatePreMiningStartClaimPhase = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'startClaimPhase', + }) + +/** + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningTotalLocked = /*#__PURE__*/ createUseReadContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'totalLocked', -}) +export const useSimulatePreMiningStartRecoveryPhase = + /*#__PURE__*/ createUseSimulateContract({ + abi: preMiningAbi, + address: preMiningAddress, + functionName: 'startRecoveryPhase', + }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"underlyingToken"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningUnderlyingToken = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningTransferOwnership = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'underlyingToken', + functionName: 'transferOwnership', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequests"` + * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningUnlockRequests = - /*#__PURE__*/ createUseReadContract({ +export const useSimulatePreMiningUnpause = + /*#__PURE__*/ createUseSimulateContract({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'unlockRequests', + functionName: 'unpause', }) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequestsCursor"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningUnlockRequestsCursor = - /*#__PURE__*/ createUseReadContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'unlockRequestsCursor', - }) +export const useWatchPreMiningEvent = /*#__PURE__*/ createUseWatchContractEvent( + { abi: preMiningAbi, address: preMiningAddress }, +) /** - * Wraps __{@link useReadContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"vestingDuration"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useReadPreMiningVestingDuration = - /*#__PURE__*/ createUseReadContract({ +export const useWatchPreMiningLockEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'vestingDuration', + eventName: 'Lock', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferStarted"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWritePreMining = /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, -}) +export const useWatchPreMiningOwnershipTransferStartedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ + abi: preMiningAbi, + address: preMiningAddress, + eventName: 'OwnershipTransferStarted', + }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferred"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWritePreMiningAcceptOwnership = - /*#__PURE__*/ createUseWriteContract({ +export const useWatchPreMiningOwnershipTransferredEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'acceptOwnership', + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Paused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWritePreMiningClaimRewards = - /*#__PURE__*/ createUseWriteContract({ +export const useWatchPreMiningPausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'claimRewards', + eventName: 'Paused', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` + * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Unpaused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ -export const useWritePreMiningEndDepositPhase = - /*#__PURE__*/ createUseWriteContract({ +export const useWatchPreMiningUnpausedEvent = + /*#__PURE__*/ createUseWatchContractEvent({ abi: preMiningAbi, address: preMiningAddress, - functionName: 'endDepositPhase', + eventName: 'Unpaused', + }) + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Action +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const readGenericErc20 = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"allowance"` + */ +export const readGenericErc20Allowance = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'allowance', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"balanceOf"` + */ +export const readGenericErc20BalanceOf = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'balanceOf', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decimals"` + */ +export const readGenericErc20Decimals = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'decimals', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"name"` + */ +export const readGenericErc20Name = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'name', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"symbol"` + */ +export const readGenericErc20Symbol = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'symbol', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"totalSupply"` + */ +export const readGenericErc20TotalSupply = /*#__PURE__*/ createReadContract({ + abi: genericErc20Abi, + functionName: 'totalSupply', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const writeGenericErc20 = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + */ +export const writeGenericErc20Approve = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'approve', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + */ +export const writeGenericErc20Burn = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'burn', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + */ +export const writeGenericErc20BurnFrom = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'burnFrom', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + */ +export const writeGenericErc20DecreaseAllowance = + /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'decreaseAllowance', + }) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + */ +export const writeGenericErc20IncreaseAllowance = + /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'increaseAllowance', + }) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` + */ +export const writeGenericErc20Mint = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'mint', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + */ +export const writeGenericErc20SetDecimals = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'setDecimals', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + */ +export const writeGenericErc20Transfer = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'transfer', +}) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + */ +export const writeGenericErc20TransferFrom = /*#__PURE__*/ createWriteContract({ + abi: genericErc20Abi, + functionName: 'transferFrom', +}) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ + */ +export const simulateGenericErc20 = /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, +}) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + */ +export const simulateGenericErc20Approve = /*#__PURE__*/ createSimulateContract( + { abi: genericErc20Abi, functionName: 'approve' }, +) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + */ +export const simulateGenericErc20Burn = /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'burn', +}) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + */ +export const simulateGenericErc20BurnFrom = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'burnFrom', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` */ -export const useWritePreMiningInstantUnlock = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'instantUnlock', +export const simulateGenericErc20DecreaseAllowance = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'decreaseAllowance', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` */ -export const useWritePreMiningLock = /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'lock', -}) +export const simulateGenericErc20IncreaseAllowance = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'increaseAllowance', + }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` */ -export const useWritePreMiningPause = /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'pause', +export const simulateGenericErc20Mint = /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'mint', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` */ -export const useWritePreMiningProcessUnlockRequests = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'processUnlockRequests', +export const simulateGenericErc20SetDecimals = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'setDecimals', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` */ -export const useWritePreMiningRecoverErc20 = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'recoverERC20', +export const simulateGenericErc20Transfer = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'transfer', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` */ -export const useWritePreMiningRenounceOwnership = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'renounceOwnership', +export const simulateGenericErc20TransferFrom = + /*#__PURE__*/ createSimulateContract({ + abi: genericErc20Abi, + functionName: 'transferFrom', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ */ -export const useWritePreMiningRequestUnlock = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'requestUnlock', - }) +export const watchGenericErc20Event = /*#__PURE__*/ createWatchContractEvent({ + abi: genericErc20Abi, +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Approval"` */ -export const useWritePreMiningSetLdyToken = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'setLDYToken', +export const watchGenericErc20ApprovalEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: genericErc20Abi, + eventName: 'Approval', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Transfer"` */ -export const useWritePreMiningStartClaimPhase = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'startClaimPhase', +export const watchGenericErc20TransferEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: genericErc20Abi, + eventName: 'Transfer', }) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWritePreMiningStartRecoveryPhase = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'startRecoveryPhase', - }) +export const readGlobalBlacklist = /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"globalOwner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWritePreMiningTransferOwnership = - /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'transferOwnership', - }) +export const readGlobalBlacklistGlobalOwner = /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'globalOwner', +}) /** - * Wraps __{@link useWriteContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"isBlacklisted"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWritePreMiningUnpause = /*#__PURE__*/ createUseWriteContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'unpause', -}) +export const readGlobalBlacklistIsBlacklisted = + /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'isBlacklisted', + }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMining = /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, +export const readGlobalBlacklistOwner = /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'owner', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"proxiableUUID"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningAcceptOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'acceptOwnership', +export const readGlobalBlacklistProxiableUuid = + /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'proxiableUUID', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"renounceOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningClaimRewards = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'claimRewards', +export const readGlobalBlacklistRenounceOwnership = + /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'renounceOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"transferOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningEndDepositPhase = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'endDepositPhase', +export const readGlobalBlacklistTransferOwnership = + /*#__PURE__*/ createReadContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningInstantUnlock = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'instantUnlock', - }) +export const writeGlobalBlacklist = /*#__PURE__*/ createWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningLock = /*#__PURE__*/ createUseSimulateContract( - { abi: preMiningAbi, address: preMiningAddress, functionName: 'lock' }, -) +export const writeGlobalBlacklistBlacklist = /*#__PURE__*/ createWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'blacklist', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningPause = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'pause', - }) +export const writeGlobalBlacklistInitialize = /*#__PURE__*/ createWriteContract( + { + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'initialize', + }, +) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningProcessUnlockRequests = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'processUnlockRequests', +export const writeGlobalBlacklistUnBlacklist = + /*#__PURE__*/ createWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'unBlacklist', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningRecoverErc20 = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'recoverERC20', - }) +export const writeGlobalBlacklistUpgradeTo = /*#__PURE__*/ createWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeTo', +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningRenounceOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'renounceOwnership', +export const writeGlobalBlacklistUpgradeToAndCall = + /*#__PURE__*/ createWriteContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningRequestUnlock = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'requestUnlock', - }) +export const simulateGlobalBlacklist = /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, +}) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningSetLdyToken = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'setLDYToken', +export const simulateGlobalBlacklistBlacklist = + /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'blacklist', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningStartClaimPhase = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'startClaimPhase', +export const simulateGlobalBlacklistInitialize = + /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'initialize', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningStartRecoveryPhase = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'startRecoveryPhase', +export const simulateGlobalBlacklistUnBlacklist = + /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'unBlacklist', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningTransferOwnership = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'transferOwnership', +export const simulateGlobalBlacklistUpgradeTo = + /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link useSimulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useSimulatePreMiningUnpause = - /*#__PURE__*/ createUseSimulateContract({ - abi: preMiningAbi, - address: preMiningAddress, - functionName: 'unpause', +export const simulateGlobalBlacklistUpgradeToAndCall = + /*#__PURE__*/ createSimulateContract({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningEvent = /*#__PURE__*/ createUseWatchContractEvent( - { abi: preMiningAbi, address: preMiningAddress }, +export const watchGlobalBlacklistEvent = /*#__PURE__*/ createWatchContractEvent( + { abi: globalBlacklistAbi, address: globalBlacklistAddress }, ) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Lock"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"AdminChanged"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningLockEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: preMiningAbi, - address: preMiningAddress, - eventName: 'Lock', +export const watchGlobalBlacklistAdminChangedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'AdminChanged', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"BeaconUpgraded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningOwnershipTransferStartedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: preMiningAbi, - address: preMiningAddress, - eventName: 'OwnershipTransferStarted', +export const watchGlobalBlacklistBeaconUpgradedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Blacklisted"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningOwnershipTransferredEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: preMiningAbi, - address: preMiningAddress, - eventName: 'OwnershipTransferred', +export const watchGlobalBlacklistBlacklistedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Blacklisted', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Paused"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Initialized"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningPausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: preMiningAbi, - address: preMiningAddress, - eventName: 'Paused', +export const watchGlobalBlacklistInitializedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link useWatchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Unpaused"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"OwnershipTransferred"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const useWatchPreMiningUnpausedEvent = - /*#__PURE__*/ createUseWatchContractEvent({ - abi: preMiningAbi, - address: preMiningAddress, - eventName: 'Unpaused', +export const watchGlobalBlacklistOwnershipTransferredEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'OwnershipTransferred', }) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Action -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ - */ -export const readGenericErc20 = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, -}) - -/** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"allowance"` - */ -export const readGenericErc20Allowance = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'allowance', -}) - /** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"balanceOf"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Unblacklisted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const readGenericErc20BalanceOf = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'balanceOf', -}) +export const watchGlobalBlacklistUnblacklistedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Unblacklisted', + }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decimals"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Upgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x88578535cA4bc6e45b90a3eDf3f43A80891354Dd) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) */ -export const readGenericErc20Decimals = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'decimals', -}) +export const watchGlobalBlacklistUpgradedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalBlacklistAbi, + address: globalBlacklistAddress, + eventName: 'Upgraded', + }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"name"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const readGenericErc20Name = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'name', +export const readGlobalOwner = /*#__PURE__*/ createReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"symbol"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"owner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const readGenericErc20Symbol = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'symbol', +export const readGlobalOwnerOwner = /*#__PURE__*/ createReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'owner', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"totalSupply"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"pendingOwner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const readGenericErc20TotalSupply = /*#__PURE__*/ createReadContract({ - abi: genericErc20Abi, - functionName: 'totalSupply', +export const readGlobalOwnerPendingOwner = /*#__PURE__*/ createReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'pendingOwner', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"proxiableUUID"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20 = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, +export const readGlobalOwnerProxiableUuid = /*#__PURE__*/ createReadContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'proxiableUUID', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20Approve = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'approve', +export const writeGlobalOwner = /*#__PURE__*/ createWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20Burn = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'burn', -}) +export const writeGlobalOwnerAcceptOwnership = + /*#__PURE__*/ createWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'acceptOwnership', + }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20BurnFrom = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'burnFrom', +export const writeGlobalOwnerInitialize = /*#__PURE__*/ createWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'initialize', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20DecreaseAllowance = +export const writeGlobalOwnerRenounceOwnership = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'decreaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'renounceOwnership', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20IncreaseAllowance = +export const writeGlobalOwnerTransferOwnership = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'increaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` - */ -export const writeGenericErc20Mint = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'mint', -}) - -/** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20SetDecimals = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'setDecimals', +export const writeGlobalOwnerUpgradeTo = /*#__PURE__*/ createWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20Transfer = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'transfer', -}) +export const writeGlobalOwnerUpgradeToAndCall = + /*#__PURE__*/ createWriteContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeToAndCall', + }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const writeGenericErc20TransferFrom = /*#__PURE__*/ createWriteContract({ - abi: genericErc20Abi, - functionName: 'transferFrom', +export const simulateGlobalOwner = /*#__PURE__*/ createSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20 = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, -}) +export const simulateGlobalOwnerAcceptOwnership = + /*#__PURE__*/ createSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'acceptOwnership', + }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"approve"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20Approve = /*#__PURE__*/ createSimulateContract( - { abi: genericErc20Abi, functionName: 'approve' }, -) +export const simulateGlobalOwnerInitialize = + /*#__PURE__*/ createSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'initialize', + }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burn"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20Burn = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'burn', -}) +export const simulateGlobalOwnerRenounceOwnership = + /*#__PURE__*/ createSimulateContract({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'renounceOwnership', + }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"burnFrom"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20BurnFrom = +export const simulateGlobalOwnerTransferOwnership = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'burnFrom', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"decreaseAllowance"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20DecreaseAllowance = +export const simulateGlobalOwnerUpgradeTo = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'decreaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeTo', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"increaseAllowance"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20IncreaseAllowance = +export const simulateGlobalOwnerUpgradeToAndCall = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'increaseAllowance', + abi: globalOwnerAbi, + address: globalOwnerAddress, + functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"mint"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20Mint = /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'mint', +export const watchGlobalOwnerEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"setDecimals"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"AdminChanged"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20SetDecimals = - /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'setDecimals', +export const watchGlobalOwnerAdminChangedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'AdminChanged', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transfer"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20Transfer = - /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'transfer', +export const watchGlobalOwnerBeaconUpgradedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link genericErc20Abi}__ and `functionName` set to `"transferFrom"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Initialized"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const simulateGenericErc20TransferFrom = - /*#__PURE__*/ createSimulateContract({ - abi: genericErc20Abi, - functionName: 'transferFrom', +export const watchGlobalOwnerInitializedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const watchGenericErc20Event = /*#__PURE__*/ createWatchContractEvent({ - abi: genericErc20Abi, -}) +export const watchGlobalOwnerOwnershipTransferStartedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'OwnershipTransferStarted', + }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Approval"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const watchGenericErc20ApprovalEvent = +export const watchGlobalOwnerOwnershipTransferredEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: genericErc20Abi, - eventName: 'Approval', + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link genericErc20Abi}__ and `eventName` set to `"Transfer"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Upgraded"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x8dC054e19EB34B6b4f2f968FF2218094849aA8B3) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) */ -export const watchGenericErc20TransferEvent = +export const watchGlobalOwnerUpgradedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: genericErc20Abi, - eventName: 'Transfer', + abi: globalOwnerAbi, + address: globalOwnerAddress, + eventName: 'Upgraded', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklist = /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const readGlobalPause = /*#__PURE__*/ createReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"globalOwner"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"globalOwner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistGlobalOwner = /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const readGlobalPauseGlobalOwner = /*#__PURE__*/ createReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'globalOwner', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"isBlacklisted"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistIsBlacklisted = - /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'isBlacklisted', - }) +export const readGlobalPauseOwner = /*#__PURE__*/ createReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'owner', +}) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistOwner = /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'owner', +export const readGlobalPausePaused = /*#__PURE__*/ createReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'paused', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"proxiableUUID"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"proxiableUUID"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistProxiableUuid = - /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'proxiableUUID', - }) +export const readGlobalPauseProxiableUuid = /*#__PURE__*/ createReadContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'proxiableUUID', +}) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"renounceOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistRenounceOwnership = +export const readGlobalPauseRenounceOwnership = /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'renounceOwnership', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"transferOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const readGlobalBlacklistTransferOwnership = +export const readGlobalPauseTransferOwnership = /*#__PURE__*/ createReadContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'transferOwnership', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklist = /*#__PURE__*/ createWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const writeGlobalPause = /*#__PURE__*/ createWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklistBlacklist = /*#__PURE__*/ createWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'blacklist', +export const writeGlobalPauseInitialize = /*#__PURE__*/ createWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'initialize', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklistInitialize = /*#__PURE__*/ createWriteContract( - { - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'initialize', - }, -) +export const writeGlobalPausePause = /*#__PURE__*/ createWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'pause', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklistUnBlacklist = - /*#__PURE__*/ createWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'unBlacklist', - }) +export const writeGlobalPauseUnpause = /*#__PURE__*/ createWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'unpause', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklistUpgradeTo = /*#__PURE__*/ createWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const writeGlobalPauseUpgradeTo = /*#__PURE__*/ createWriteContract({ + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeTo', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const writeGlobalBlacklistUpgradeToAndCall = +export const writeGlobalPauseUpgradeToAndCall = /*#__PURE__*/ createWriteContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklist = /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, +export const simulateGlobalPause = /*#__PURE__*/ createSimulateContract({ + abi: globalPauseAbi, + address: globalPauseAddress, }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"blacklist"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklistBlacklist = +export const simulateGlobalPauseInitialize = /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'blacklist', + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'initialize', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklistInitialize = - /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'initialize', - }) +export const simulateGlobalPausePause = /*#__PURE__*/ createSimulateContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'pause', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"unBlacklist"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklistUnBlacklist = - /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - functionName: 'unBlacklist', - }) +export const simulateGlobalPauseUnpause = /*#__PURE__*/ createSimulateContract({ + abi: globalPauseAbi, + address: globalPauseAddress, + functionName: 'unpause', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklistUpgradeTo = +export const simulateGlobalPauseUpgradeTo = /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeTo', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalBlacklistAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const simulateGlobalBlacklistUpgradeToAndCall = +export const simulateGlobalPauseUpgradeToAndCall = /*#__PURE__*/ createSimulateContract({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, functionName: 'upgradeToAndCall', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistEvent = /*#__PURE__*/ createWatchContractEvent( - { abi: globalBlacklistAbi, address: globalBlacklistAddress }, -) +export const watchGlobalPauseEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: globalPauseAbi, + address: globalPauseAddress, +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"AdminChanged"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistAdminChangedEvent = +export const watchGlobalPauseAdminChangedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'AdminChanged', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"BeaconUpgraded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistBeaconUpgradedEvent = +export const watchGlobalPauseBeaconUpgradedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'BeaconUpgraded', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Blacklisted"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Initialized"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistBlacklistedEvent = +export const watchGlobalPauseInitializedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Blacklisted', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Initialized', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"OwnershipTransferred"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistInitializedEvent = +export const watchGlobalPauseOwnershipTransferredEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Initialized', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistOwnershipTransferredEvent = +export const watchGlobalPausePausedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'OwnershipTransferred', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Paused', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Unblacklisted"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Unpaused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistUnblacklistedEvent = +export const watchGlobalPauseUnpausedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, - eventName: 'Unblacklisted', + abi: globalPauseAbi, + address: globalPauseAddress, + eventName: 'Unpaused', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalBlacklistAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Upgraded"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0xc44395eC149C6743A268A901a38e5b02dc87D10C) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7fbE57dD4Ba76CACBFfBA821EE0B7faa240a11bf) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1549647606A71B2a79b85AEb54631b8eA2a1939a) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0xe5053FFc5EEcb12bB3596fC4dA8625Ba30449DAE) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) */ -export const watchGlobalBlacklistUpgradedEvent = +export const watchGlobalPauseUpgradedEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalBlacklistAbi, - address: globalBlacklistAddress, + abi: globalPauseAbi, + address: globalPauseAddress, eventName: 'Upgraded', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link writeContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ */ -export const readGlobalOwner = /*#__PURE__*/ createReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const writeITransfersListener = /*#__PURE__*/ createWriteContract({ + abi: iTransfersListenerAbi, }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"owner"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link writeContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` */ -export const readGlobalOwnerOwner = /*#__PURE__*/ createReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'owner', -}) +export const writeITransfersListenerOnLTokenTransfer = + /*#__PURE__*/ createWriteContract({ + abi: iTransfersListenerAbi, + functionName: 'onLTokenTransfer', + }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"pendingOwner"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ */ -export const readGlobalOwnerPendingOwner = /*#__PURE__*/ createReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'pendingOwner', +export const simulateITransfersListener = /*#__PURE__*/ createSimulateContract({ + abi: iTransfersListenerAbi, }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"proxiableUUID"` - * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * Wraps __{@link simulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` */ -export const readGlobalOwnerProxiableUuid = /*#__PURE__*/ createReadContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'proxiableUUID', -}) +export const simulateITransfersListenerOnLTokenTransfer = + /*#__PURE__*/ createSimulateContract({ + abi: iTransfersListenerAbi, + functionName: 'onLTokenTransfer', + }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwner = /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const readLdy = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"allowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerAcceptOwnership = - /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'acceptOwnership', - }) +export const readLdyAllowance = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'allowance', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"balanceOf"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerInitialize = /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'initialize', +export const readLdyBalanceOf = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'balanceOf', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decimals"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerRenounceOwnership = - /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'renounceOwnership', - }) +export const readLdyDecimals = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decimals', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"name"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerTransferOwnership = - /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'transferOwnership', - }) +export const readLdyName = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'name', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"symbol"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerUpgradeTo = /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeTo', +export const readLdySymbol = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'symbol', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"totalSupply"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const writeGlobalOwnerUpgradeToAndCall = - /*#__PURE__*/ createWriteContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeToAndCall', - }) +export const readLdyTotalSupply = /*#__PURE__*/ createReadContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'totalSupply', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwner = /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const writeLdy = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"approve"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerAcceptOwnership = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'acceptOwnership', - }) +export const writeLdyApprove = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'approve', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burn"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerInitialize = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'initialize', - }) +export const writeLdyBurn = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burn', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burnFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerRenounceOwnership = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'renounceOwnership', - }) +export const writeLdyBurnFrom = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burnFrom', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decreaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerTransferOwnership = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'transferOwnership', - }) +export const writeLdyDecreaseAllowance = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decreaseAllowance', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"increaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerUpgradeTo = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeTo', - }) +export const writeLdyIncreaseAllowance = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'increaseAllowance', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalOwnerAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transfer"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const simulateGlobalOwnerUpgradeToAndCall = - /*#__PURE__*/ createSimulateContract({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - functionName: 'upgradeToAndCall', - }) +export const writeLdyTransfer = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transfer', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transferFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, +export const writeLdyTransferFrom = /*#__PURE__*/ createWriteContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transferFrom', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerAdminChangedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'AdminChanged', - }) +export const simulateLdy = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"approve"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerBeaconUpgradedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'BeaconUpgraded', - }) +export const simulateLdyApprove = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'approve', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burn"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerInitializedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'Initialized', - }) +export const simulateLdyBurn = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burn', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"burnFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerOwnershipTransferStartedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'OwnershipTransferStarted', - }) +export const simulateLdyBurnFrom = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'burnFrom', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"decreaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerOwnershipTransferredEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'OwnershipTransferred', +export const simulateLdyDecreaseAllowance = + /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'decreaseAllowance', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalOwnerAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"increaseAllowance"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2547A36186eCC16C25649B9234D4937216e45978) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0xDbac01A784fB7E5F1Ae9c8d61f776A2d9d59faB6) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xe4Af4573bFc5F04D8b84c61744de8A94059f2462) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0xcA55A2394876e7Cf52e99Ab36Fc9151a7d9CF350) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const watchGlobalOwnerUpgradedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalOwnerAbi, - address: globalOwnerAddress, - eventName: 'Upgraded', +export const simulateLdyIncreaseAllowance = + /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'increaseAllowance', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transfer"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const readGlobalPause = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const simulateLdyTransfer = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transfer', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"globalOwner"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyAbi}__ and `functionName` set to `"transferFrom"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const readGlobalPauseGlobalOwner = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'globalOwner', +export const simulateLdyTransferFrom = /*#__PURE__*/ createSimulateContract({ + abi: ldyAbi, + address: ldyAddress, + functionName: 'transferFrom', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) + */ +export const watchLdyEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, +}) + +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyAbi}__ and `eventName` set to `"Approval"` + * + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const readGlobalPauseOwner = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'owner', +export const watchLdyApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, + eventName: 'Approval', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"paused"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyAbi}__ and `eventName` set to `"Transfer"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) - * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x3AB39A3B53f316e2e4d4fdCaEdB0FD405C68dca7) */ -export const readGlobalPausePaused = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'paused', +export const watchLdyTransferEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: ldyAbi, + address: ldyAddress, + eventName: 'Transfer', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"proxiableUUID"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readGlobalPauseProxiableUuid = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'proxiableUUID', +export const readLdyStaking = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeAmountForPerks"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readGlobalPauseRenounceOwnership = +export const readLdyStakingStakeAmountForPerks = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'renounceOwnership', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeAmountForPerks', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeDurationForPerks"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readGlobalPauseTransferOwnership = +export const readLdyStakingStakeDurationForPerks = /*#__PURE__*/ createReadContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'transferOwnership', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeDurationForPerks', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"StakeDurations"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPause = /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const readLdyStakingStakeDurations = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'StakeDurations', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"Token"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPauseInitialize = /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'initialize', +export const readLdyStakingToken = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'Token', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"earned"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPausePause = /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'pause', +export const readLdyStakingEarned = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'earned', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"finishAt"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPauseUnpause = /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'unpause', +export const readLdyStakingFinishAt = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'finishAt', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getUserStakes"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPauseUpgradeTo = /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeTo', +export const readLdyStakingGetUserStakes = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'getUserStakes', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"highTierAccounts"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeGlobalPauseUpgradeToAndCall = - /*#__PURE__*/ createWriteContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeToAndCall', +export const readLdyStakingHighTierAccounts = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'highTierAccounts', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"lastTimeRewardApplicable"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const readLdyStakingLastTimeRewardApplicable = + /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'lastTimeRewardApplicable', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"lastUpdateTime"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPause = /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const readLdyStakingLastUpdateTime = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'lastUpdateTime', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"initialize"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"owner"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPauseInitialize = - /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'initialize', - }) +export const readLdyStakingOwner = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'owner', +}) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"pause"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"paused"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const readLdyStakingPaused = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'paused', +}) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pendingOwner"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPausePause = /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'pause', +export const readLdyStakingPendingOwner = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'pendingOwner', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"unpause"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardPerToken"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPauseUnpause = /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'unpause', +export const readLdyStakingRewardPerToken = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardPerToken', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeTo"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardPerTokenStored"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPauseUpgradeTo = - /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeTo', +export const readLdyStakingRewardPerTokenStored = + /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardPerTokenStored', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link globalPauseAbi}__ and `functionName` set to `"upgradeToAndCall"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardRatePerSec"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateGlobalPauseUpgradeToAndCall = - /*#__PURE__*/ createSimulateContract({ - abi: globalPauseAbi, - address: globalPauseAddress, - functionName: 'upgradeToAndCall', - }) +export const readLdyStakingRewardRatePerSec = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardRatePerSec', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"rewardsDuration"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, +export const readLdyStakingRewardsDuration = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'rewardsDuration', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"AdminChanged"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"tierOf"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseAdminChangedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'AdminChanged', - }) +export const readLdyStakingTierOf = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'tierOf', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"BeaconUpgraded"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"totalStaked"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseBeaconUpgradedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'BeaconUpgraded', - }) +export const readLdyStakingTotalStaked = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'totalStaked', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Initialized"` + * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"userStakingInfo"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseInitializedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Initialized', - }) +export const readLdyStakingUserStakingInfo = /*#__PURE__*/ createReadContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'userStakingInfo', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseOwnershipTransferredEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'OwnershipTransferred', - }) +export const writeLdyStaking = /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Paused"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPausePausedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Paused', - }) +export const writeLdyStakingAcceptOwnership = /*#__PURE__*/ createWriteContract( + { + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'acceptOwnership', + }, +) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Unpaused"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getReward"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseUnpausedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Unpaused', - }) +export const writeLdyStakingGetReward = /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'getReward', +}) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link globalPauseAbi}__ and `eventName` set to `"Upgraded"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"notifyRewardAmount"` * - * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x696C4B4f35Ee60e110cDaE5b3eBd78a5597f6Ac6) + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x4fB551213757619558A93a599a08524e9Dd59C67) - * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd4D4c68CE70fa88B9E527DD3A4a6d19c5cbdd4dB) - * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x06f54B7f27eEC56616b951598BaA3B84D7660AB4) + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchGlobalPauseUpgradedEvent = - /*#__PURE__*/ createWatchContractEvent({ - abi: globalPauseAbi, - address: globalPauseAddress, - eventName: 'Upgraded', +export const writeLdyStakingNotifyRewardAmount = + /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'notifyRewardAmount', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pause"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeITransfersListener = /*#__PURE__*/ createWriteContract({ - abi: iTransfersListenerAbi, +export const writeLdyStakingPause = /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'pause', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const writeLdyStakingRenounceOwnership = + /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'renounceOwnership', + }) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setRewardsDuration"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeITransfersListenerOnLTokenTransfer = +export const writeLdyStakingSetRewardsDuration = /*#__PURE__*/ createWriteContract({ - abi: iTransfersListenerAbi, - functionName: 'onLTokenTransfer', + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'setRewardsDuration', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"stake"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateITransfersListener = /*#__PURE__*/ createSimulateContract({ - abi: iTransfersListenerAbi, +export const writeLdyStakingStake = /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'stake', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link iTransfersListenerAbi}__ and `functionName` set to `"onLTokenTransfer"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateITransfersListenerOnLTokenTransfer = - /*#__PURE__*/ createSimulateContract({ - abi: iTransfersListenerAbi, - functionName: 'onLTokenTransfer', +export const writeLdyStakingTransferOwnership = + /*#__PURE__*/ createWriteContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'transferOwnership', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readLdyStaking = /*#__PURE__*/ createReadContract({ +export const writeLdyStakingUnpause = /*#__PURE__*/ createWriteContract({ abi: ldyStakingAbi, address: ldyStakingAddress, + functionName: 'unpause', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"highTierAccounts"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unstake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readLdyStakingHighTierAccounts = /*#__PURE__*/ createReadContract({ +export const writeLdyStakingUnstake = /*#__PURE__*/ createWriteContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'highTierAccounts', + functionName: 'unstake', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"owner"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readLdyStakingOwner = /*#__PURE__*/ createReadContract({ +export const simulateLdyStaking = /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'owner', }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pendingOwner"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readLdyStakingPendingOwner = /*#__PURE__*/ createReadContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, - functionName: 'pendingOwner', -}) +export const simulateLdyStakingAcceptOwnership = + /*#__PURE__*/ createSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'acceptOwnership', + }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"tierOf"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"getReward"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const readLdyStakingTierOf = /*#__PURE__*/ createReadContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, - functionName: 'tierOf', -}) +export const simulateLdyStakingGetReward = /*#__PURE__*/ createSimulateContract( + { abi: ldyStakingAbi, address: ldyStakingAddress, functionName: 'getReward' }, +) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"notifyRewardAmount"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeLdyStaking = /*#__PURE__*/ createWriteContract({ +export const simulateLdyStakingNotifyRewardAmount = + /*#__PURE__*/ createSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'notifyRewardAmount', + }) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"pause"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const simulateLdyStakingPause = /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, + functionName: 'pause', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeLdyStakingAcceptOwnership = /*#__PURE__*/ createWriteContract( - { +export const simulateLdyStakingRenounceOwnership = + /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'acceptOwnership', - }, -) + functionName: 'renounceOwnership', + }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setRewardsDuration"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeLdyStakingRenounceOwnership = - /*#__PURE__*/ createWriteContract({ +export const simulateLdyStakingSetRewardsDuration = + /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'renounceOwnership', + functionName: 'setRewardsDuration', }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setHighTierAccount"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"stake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeLdyStakingSetHighTierAccount = - /*#__PURE__*/ createWriteContract({ - abi: ldyStakingAbi, - address: ldyStakingAddress, - functionName: 'setHighTierAccount', - }) +export const simulateLdyStakingStake = /*#__PURE__*/ createSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'stake', +}) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const writeLdyStakingTransferOwnership = - /*#__PURE__*/ createWriteContract({ +export const simulateLdyStakingTransferOwnership = + /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, functionName: 'transferOwnership', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateLdyStaking = /*#__PURE__*/ createSimulateContract({ +export const simulateLdyStakingUnpause = /*#__PURE__*/ createSimulateContract({ abi: ldyStakingAbi, address: ldyStakingAddress, + functionName: 'unpause', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"acceptOwnership"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"unstake"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateLdyStakingAcceptOwnership = - /*#__PURE__*/ createSimulateContract({ +export const simulateLdyStakingUnstake = /*#__PURE__*/ createSimulateContract({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + functionName: 'unstake', +}) + +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const watchLdyStakingEvent = /*#__PURE__*/ createWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, +}) + +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * + * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) + * - + * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) + * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) + * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) + * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) + */ +export const watchLdyStakingOwnershipTransferStartedEvent = + /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'acceptOwnership', + eventName: 'OwnershipTransferStarted', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"renounceOwnership"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferred"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateLdyStakingRenounceOwnership = - /*#__PURE__*/ createSimulateContract({ +export const watchLdyStakingOwnershipTransferredEvent = + /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'renounceOwnership', + eventName: 'OwnershipTransferred', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"setHighTierAccount"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Paused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateLdyStakingSetHighTierAccount = - /*#__PURE__*/ createSimulateContract({ +export const watchLdyStakingPausedEvent = + /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'setHighTierAccount', + eventName: 'Paused', }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link ldyStakingAbi}__ and `functionName` set to `"transferOwnership"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"RewardPaid"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const simulateLdyStakingTransferOwnership = - /*#__PURE__*/ createSimulateContract({ +export const watchLdyStakingRewardPaidEvent = + /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - functionName: 'transferOwnership', + eventName: 'RewardPaid', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Staked"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchLdyStakingEvent = /*#__PURE__*/ createWatchContractEvent({ - abi: ldyStakingAbi, - address: ldyStakingAddress, -}) +export const watchLdyStakingStakedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: ldyStakingAbi, + address: ldyStakingAddress, + eventName: 'Staked', + }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferStarted"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Unpaused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchLdyStakingOwnershipTransferStartedEvent = +export const watchLdyStakingUnpausedEvent = /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - eventName: 'OwnershipTransferStarted', + eventName: 'Unpaused', }) /** - * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"OwnershipTransferred"` + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link ldyStakingAbi}__ and `eventName` set to `"Unstaked"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x045f9E9d2225319dF5E0909007FE7979E2674a32) * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x4e80beDBD58b084a8946b7BA6814c28906Be2d02) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x7A78A93dad6A64d0A92C913C008dC79dBf919Fa6) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x508c8530a9c87439Ff82AE3dFA070BCdEBf0715b) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x5BFFC5303719f0dC6050a2D8042936714109985f) */ -export const watchLdyStakingOwnershipTransferredEvent = +export const watchLdyStakingUnstakedEvent = /*#__PURE__*/ createWatchContractEvent({ abi: ldyStakingAbi, address: ldyStakingAddress, - eventName: 'OwnershipTransferred', + eventName: 'Unstaked', }) /** @@ -9319,6 +11686,7 @@ export const watchLTokenUpgradedEvent = /*#__PURE__*/ createWatchContractEvent({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignaler = /*#__PURE__*/ createReadContract({ @@ -9334,6 +11702,7 @@ export const readLTokenSignaler = /*#__PURE__*/ createReadContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignalerGlobalOwner = /*#__PURE__*/ createReadContract({ @@ -9350,6 +11719,7 @@ export const readLTokenSignalerGlobalOwner = /*#__PURE__*/ createReadContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignalerOwner = /*#__PURE__*/ createReadContract({ @@ -9366,6 +11736,7 @@ export const readLTokenSignalerOwner = /*#__PURE__*/ createReadContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignalerProxiableUuid = /*#__PURE__*/ createReadContract( @@ -9384,6 +11755,7 @@ export const readLTokenSignalerProxiableUuid = /*#__PURE__*/ createReadContract( * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignalerRenounceOwnership = @@ -9401,6 +11773,7 @@ export const readLTokenSignalerRenounceOwnership = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const readLTokenSignalerTransferOwnership = @@ -9418,6 +11791,7 @@ export const readLTokenSignalerTransferOwnership = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const writeLTokenSignaler = /*#__PURE__*/ createWriteContract({ @@ -9433,6 +11807,7 @@ export const writeLTokenSignaler = /*#__PURE__*/ createWriteContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const writeLTokenSignalerInitialize = /*#__PURE__*/ createWriteContract({ @@ -9449,6 +11824,7 @@ export const writeLTokenSignalerInitialize = /*#__PURE__*/ createWriteContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const writeLTokenSignalerSignalLToken = @@ -9466,6 +11842,7 @@ export const writeLTokenSignalerSignalLToken = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const writeLTokenSignalerUpgradeTo = /*#__PURE__*/ createWriteContract({ @@ -9482,6 +11859,7 @@ export const writeLTokenSignalerUpgradeTo = /*#__PURE__*/ createWriteContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const writeLTokenSignalerUpgradeToAndCall = @@ -9499,6 +11877,7 @@ export const writeLTokenSignalerUpgradeToAndCall = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const simulateLTokenSignaler = /*#__PURE__*/ createSimulateContract({ @@ -9514,6 +11893,7 @@ export const simulateLTokenSignaler = /*#__PURE__*/ createSimulateContract({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const simulateLTokenSignalerInitialize = @@ -9531,6 +11911,7 @@ export const simulateLTokenSignalerInitialize = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const simulateLTokenSignalerSignalLToken = @@ -9548,6 +11929,7 @@ export const simulateLTokenSignalerSignalLToken = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const simulateLTokenSignalerUpgradeTo = @@ -9565,6 +11947,7 @@ export const simulateLTokenSignalerUpgradeTo = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const simulateLTokenSignalerUpgradeToAndCall = @@ -9582,6 +11965,7 @@ export const simulateLTokenSignalerUpgradeToAndCall = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerEvent = /*#__PURE__*/ createWatchContractEvent({ @@ -9597,6 +11981,7 @@ export const watchLTokenSignalerEvent = /*#__PURE__*/ createWatchContractEvent({ * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerAdminChangedEvent = @@ -9614,6 +11999,7 @@ export const watchLTokenSignalerAdminChangedEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerBeaconUpgradedEvent = @@ -9631,6 +12017,7 @@ export const watchLTokenSignalerBeaconUpgradedEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerInitializedEvent = @@ -9648,6 +12035,7 @@ export const watchLTokenSignalerInitializedEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerLTokenSignalEventEvent = @@ -9665,6 +12053,7 @@ export const watchLTokenSignalerLTokenSignalEventEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerOwnershipTransferredEvent = @@ -9682,6 +12071,7 @@ export const watchLTokenSignalerOwnershipTransferredEvent = * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x627Ff3485a2e34916a6E1c0D0b350A422F5d89D1) * - [__View Contract on Linea Goerli Testnet Etherscan__](https://goerli.lineascan.build/address/0x04a678103bE57c3d81100fe08e43C94e50adC37B) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xBA427517505b14C560854aED003304Fc69cbadfb) + * - [__View Contract on Base Sepolia Basescan__](https://sepolia.basescan.org/address/0x0772879C3025451A3AE88478044E4eF7bEe2F832) * - [__View Contract on Arbitrum Goerli Arbiscan__](https://goerli.arbiscan.io/address/0x1dA817E33C0dB209C7b508B79F9dac4480f94522) */ export const watchLTokenSignalerUpgradedEvent = @@ -9695,7 +12085,6 @@ export const watchLTokenSignalerUpgradedEvent = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9708,7 +12097,6 @@ export const readPreMining = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"accountsLocks"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9722,7 +12110,6 @@ export const readPreMiningAccountsLocks = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"availableToClaim"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9736,7 +12123,6 @@ export const readPreMiningAvailableToClaim = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimPhaseStartTimestamp"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9751,7 +12137,6 @@ export const readPreMiningClaimPhaseStartTimestamp = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"eligibleRewardsOf"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9765,7 +12150,6 @@ export const readPreMiningEligibleRewardsOf = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasClaimPhaseStarted"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9780,7 +12164,6 @@ export const readPreMiningHasClaimPhaseStarted = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasDepositPhaseEnded"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9795,7 +12178,6 @@ export const readPreMiningHasDepositPhaseEnded = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"hasRecoveryPhaseStarted"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9810,7 +12192,6 @@ export const readPreMiningHasRecoveryPhaseStarted = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9824,7 +12205,6 @@ export const readPreMiningLToken = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"ldyToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9838,7 +12218,6 @@ export const readPreMiningLdyToken = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lockedHardCap"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9852,7 +12231,6 @@ export const readPreMiningLockedHardCap = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxDistributedLDY"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9866,7 +12244,6 @@ export const readPreMiningMaxDistributedLdy = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxLockDuration"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9880,7 +12257,6 @@ export const readPreMiningMaxLockDuration = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"maxWeight"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9894,7 +12270,6 @@ export const readPreMiningMaxWeight = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"minLockDuration"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9908,7 +12283,6 @@ export const readPreMiningMinLockDuration = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"owner"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9922,7 +12296,6 @@ export const readPreMiningOwner = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"paused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9936,7 +12309,6 @@ export const readPreMiningPaused = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pendingOwner"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9950,7 +12322,6 @@ export const readPreMiningPendingOwner = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"totalLocked"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9964,7 +12335,6 @@ export const readPreMiningTotalLocked = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"underlyingToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9978,7 +12348,6 @@ export const readPreMiningUnderlyingToken = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequests"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -9992,7 +12361,6 @@ export const readPreMiningUnlockRequests = /*#__PURE__*/ createReadContract({ * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unlockRequestsCursor"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10007,7 +12375,6 @@ export const readPreMiningUnlockRequestsCursor = * Wraps __{@link readContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"vestingDuration"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10021,7 +12388,6 @@ export const readPreMiningVestingDuration = /*#__PURE__*/ createReadContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10034,7 +12400,6 @@ export const writePreMining = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10048,7 +12413,6 @@ export const writePreMiningAcceptOwnership = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10062,7 +12426,6 @@ export const writePreMiningClaimRewards = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10076,7 +12439,6 @@ export const writePreMiningEndDepositPhase = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10090,7 +12452,6 @@ export const writePreMiningInstantUnlock = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10104,7 +12465,6 @@ export const writePreMiningLock = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10118,7 +12478,6 @@ export const writePreMiningPause = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10133,7 +12492,6 @@ export const writePreMiningProcessUnlockRequests = * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10147,7 +12505,6 @@ export const writePreMiningRecoverErc20 = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10162,7 +12519,6 @@ export const writePreMiningRenounceOwnership = * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10176,7 +12532,6 @@ export const writePreMiningRequestUnlock = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10190,7 +12545,6 @@ export const writePreMiningSetLdyToken = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10204,7 +12558,6 @@ export const writePreMiningStartClaimPhase = /*#__PURE__*/ createWriteContract({ * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10219,7 +12572,6 @@ export const writePreMiningStartRecoveryPhase = * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10234,7 +12586,6 @@ export const writePreMiningTransferOwnership = * Wraps __{@link writeContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10248,7 +12599,6 @@ export const writePreMiningUnpause = /*#__PURE__*/ createWriteContract({ * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10261,7 +12611,6 @@ export const simulatePreMining = /*#__PURE__*/ createSimulateContract({ * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"acceptOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10276,7 +12625,6 @@ export const simulatePreMiningAcceptOwnership = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"claimRewards"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10291,7 +12639,6 @@ export const simulatePreMiningClaimRewards = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"endDepositPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10306,7 +12653,6 @@ export const simulatePreMiningEndDepositPhase = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"instantUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10321,7 +12667,6 @@ export const simulatePreMiningInstantUnlock = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10335,7 +12680,6 @@ export const simulatePreMiningLock = /*#__PURE__*/ createSimulateContract({ * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"pause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10349,7 +12693,6 @@ export const simulatePreMiningPause = /*#__PURE__*/ createSimulateContract({ * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"processUnlockRequests"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10364,7 +12707,6 @@ export const simulatePreMiningProcessUnlockRequests = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"recoverERC20"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10379,7 +12721,6 @@ export const simulatePreMiningRecoverErc20 = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"renounceOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10394,7 +12735,6 @@ export const simulatePreMiningRenounceOwnership = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"requestUnlock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10409,7 +12749,6 @@ export const simulatePreMiningRequestUnlock = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"setLDYToken"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10424,7 +12763,6 @@ export const simulatePreMiningSetLdyToken = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startClaimPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10439,7 +12777,6 @@ export const simulatePreMiningStartClaimPhase = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"startRecoveryPhase"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10454,7 +12791,6 @@ export const simulatePreMiningStartRecoveryPhase = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"transferOwnership"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10469,7 +12805,6 @@ export const simulatePreMiningTransferOwnership = * Wraps __{@link simulateContract}__ with `abi` set to __{@link preMiningAbi}__ and `functionName` set to `"unpause"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10483,7 +12818,6 @@ export const simulatePreMiningUnpause = /*#__PURE__*/ createSimulateContract({ * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10496,7 +12830,6 @@ export const watchPreMiningEvent = /*#__PURE__*/ createWatchContractEvent({ * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Lock"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10510,7 +12843,6 @@ export const watchPreMiningLockEvent = /*#__PURE__*/ createWatchContractEvent({ * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferStarted"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10525,7 +12857,6 @@ export const watchPreMiningOwnershipTransferStartedEvent = * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"OwnershipTransferred"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10540,7 +12871,6 @@ export const watchPreMiningOwnershipTransferredEvent = * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Paused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ @@ -10552,7 +12882,6 @@ export const watchPreMiningPausedEvent = /*#__PURE__*/ createWatchContractEvent( * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link preMiningAbi}__ and `eventName` set to `"Unpaused"` * * - [__View Contract on X1 Testnet Ok Link__](https://www.oklink.com/x1-test/address/0x2Bb79F621518BbA45dA5Ec57BC885C4686A60De9) - * - * - [__View Contract on Arbitrum One Arbiscan__](https://arbiscan.io/address/0x9d7AEDefE90B880c5a9Bed4FcBd3faD0ea5AA06c) * - [__View Contract on Linea Mainnet Etherscan__](https://lineascan.build/address/0xd54d564606611A3502FE8909bBD3075dbeb77813) */ diff --git a/src/lib/dapp/chains.ts b/src/lib/dapp/chains.ts index b042f1a8..36e42674 100644 --- a/src/lib/dapp/chains.ts +++ b/src/lib/dapp/chains.ts @@ -1,4 +1,12 @@ -import { hardhat, arbitrum, arbitrumGoerli, lineaTestnet, linea, Chain } from "@wagmi/core/chains"; +import { + hardhat, + arbitrum, + arbitrumGoerli, + lineaTestnet, + linea, + Chain, + base, +} from "@wagmi/core/chains"; // Build chain icons map export const chainsIcons = { @@ -8,6 +16,7 @@ export const chainsIcons = { 59140: "/assets/chains/linea-goerli.png", 59144: "/assets/chains/linea.png", 195: "/assets/chains/okxlogo.png", + 8453: "/assets/chains/base.png", } as { [key: number]: string }; const okcTestnet: Chain = { @@ -34,7 +43,7 @@ if (process.env.VERCEL_ENV === "preview") chainsEnv = "dev"; if (process.env.NODE_ENV !== "production") chainsEnv = "dev"; // Build chain lists for each environment, and export chains for the current one -const prodChains: readonly [Chain, ...Chain[]] = [arbitrum, linea, okcTestnet]; +const prodChains: readonly [Chain, ...Chain[]] = [arbitrum, linea, base, okcTestnet]; const devChains: readonly [Chain, ...Chain[]] = [ ...prodChains, hardhat,