diff --git a/copy_evm_deployments_to_frontend.sh b/copy_evm_deployments_to_frontend.sh index 5d2db28..031ac18 100755 --- a/copy_evm_deployments_to_frontend.sh +++ b/copy_evm_deployments_to_frontend.sh @@ -4,3 +4,4 @@ cp "./evm/ignition/deployments/chain-31337/deployed_addresses.json" "./frontend/ cp "./evm/ignition/deployments/chain-31337/artifacts/MainModule#MessageBox.json" "./frontend/src/evm-output/MessageBox.artifacts.json" cp "./evm/ignition/deployments/chain-31337/artifacts/MainModule#PADToken.json" "./frontend/src/evm-output/PADToken.artifacts.json" +cp "./evm/ignition/deployments/chain-31337/artifacts/MainModule#PADTokenStake.json" "./frontend/src/evm-output/PADTokenStake.artifacts.json" diff --git a/evm/contracts/PADToken.sol b/evm/contracts/PADToken.sol index 50b2321..0b2a95b 100644 --- a/evm/contracts/PADToken.sol +++ b/evm/contracts/PADToken.sol @@ -4,16 +4,19 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; -contract PADToken is ERC20, Ownable, ERC20Permit { +contract PADToken is ERC20, Ownable { constructor(address initialOwner) ERC20("PAD Token", "PAD") Ownable(initialOwner) - ERC20Permit("PAD Token") {} function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } + + function approveMax(address spender) public returns (bool) { + uint value = type(uint256).max; + return approve(spender, value); + } } diff --git a/evm/contracts/PADTokenStake.sol b/evm/contracts/PADTokenStake.sol new file mode 100644 index 0000000..a033568 --- /dev/null +++ b/evm/contracts/PADTokenStake.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./PADToken.sol"; + +contract PADTokenStake { + // pool id => pool info + mapping (uint => Pool) pools; + // staker => deposits + mapping(address => Deposit[]) deposits; + uint nextPoolId = 0; + uint nextDepositId = 0; + PADToken immutable padToken; + + struct Pool { + uint id; + uint lockdownDays; + uint rewardPercentage; + } + + struct Deposit { + uint id; + address staker; + uint poolId; + uint amount; + uint lockedAt; + uint releasedAt; + } + + constructor(PADToken _padToken) { + padToken = _padToken; + _initPools(); + } + + function _initPools() internal { + pools[0] = Pool({ + id: nextPoolId, + lockdownDays: 30, + rewardPercentage: 25 + }); + nextPoolId++; + + pools[1] = Pool({ + id: nextPoolId, + lockdownDays: 60, + rewardPercentage: 50 + }); + nextPoolId++; + } + + function stake(uint poolId, uint amount) external { + Pool memory pool = pools[poolId]; + Deposit memory newDeposit = Deposit({ + id: nextDepositId, + staker: msg.sender, + poolId: poolId, + amount: amount, + lockedAt: block.timestamp, + releasedAt: block.timestamp + (pool.lockdownDays * 1 days) + }); + deposits[msg.sender].push(newDeposit); + } + + function getDeposit(uint depositId) public view returns (Deposit memory) { + Deposit memory deposit; + for (uint i = 0; i < deposits[msg.sender].length; i++) { + deposit = deposits[msg.sender][i]; + if (deposit.id == depositId) { + return deposit; + } + } + revert("Deposit with the given ID not found."); + } + + function getWithdrawPenalty(uint depositId) public view returns (uint) { + Deposit memory deposit = getDeposit(depositId); + uint remainingMs = deposit.releasedAt - block.timestamp; + + if (remainingMs <= 0) { + return 0; + } + + // TODO Find a meaningful formula + return 100; + } + + function withdraw(uint depositId, bool acceptPenaltyCut) external { + uint penalty = getWithdrawPenalty(depositId); + if (penalty > 0) { + require(acceptPenaltyCut, "You should accept the penalty cut."); + } + + Deposit memory deposit = getDeposit(depositId); + Pool memory pool = pools[deposit.poolId]; + uint amountToTransfer = (deposit.amount * pool.rewardPercentage / 100) - penalty; + padToken.transfer(deposit.staker, amountToTransfer); + } +} diff --git a/evm/ignition/modules/Main.ts b/evm/ignition/modules/Main.ts index 9d22a5a..9099e39 100644 --- a/evm/ignition/modules/Main.ts +++ b/evm/ignition/modules/Main.ts @@ -11,7 +11,9 @@ const MainModule = buildModule("MainModule", (m) => { const padToken = m.contract("PADToken", [initialOwner]); - return { messageBox, padToken }; + const padTokenStake = m.contract("PADTokenStake", [padToken]); + + return { messageBox, padToken, padTokenStake }; }); export default MainModule; diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 65942c8..c1049e5 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -20,6 +20,9 @@ export function Header() { PAD Token + + PAD Token Stake + diff --git a/frontend/src/evm-output/PADToken.artifacts.json b/frontend/src/evm-output/PADToken.artifacts.json index 518a4c1..b48b724 100644 --- a/frontend/src/evm-output/PADToken.artifacts.json +++ b/frontend/src/evm-output/PADToken.artifacts.json @@ -14,33 +14,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [], - "name": "ECDSAInvalidSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "ECDSAInvalidSignatureLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "ECDSAInvalidSignatureS", - "type": "error" - }, { "inputs": [ { @@ -127,54 +100,6 @@ "name": "ERC20InvalidSpender", "type": "error" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "ERC2612ExpiredSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "signer", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "ERC2612InvalidSigner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "currentNonce", - "type": "uint256" - } - ], - "name": "InvalidAccountNonce", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidShortString", - "type": "error" - }, { "inputs": [ { @@ -197,17 +122,6 @@ "name": "OwnableUnauthorizedAccount", "type": "error" }, - { - "inputs": [ - { - "internalType": "string", - "name": "str", - "type": "string" - } - ], - "name": "StringTooLong", - "type": "error" - }, { "anonymous": false, "inputs": [ @@ -233,12 +147,6 @@ "name": "Approval", "type": "event" }, - { - "anonymous": false, - "inputs": [], - "name": "EIP712DomainChanged", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -283,19 +191,6 @@ "name": "Transfer", "type": "event" }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -344,6 +239,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "approveMax", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -376,49 +290,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "eip712Domain", - "outputs": [ - { - "internalType": "bytes1", - "name": "fields", - "type": "bytes1" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "version", - "type": "string" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "verifyingContract", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "uint256[]", - "name": "extensions", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -450,25 +321,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "owner", @@ -482,49 +334,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "renounceOwnership", @@ -625,8 +434,8 @@ "type": "function" } ], - "bytecode": "0x6101606040523480156200001257600080fd5b5060405162002a2938038062002a298339818101604052810190620000389190620004d3565b6040518060400160405280600981526020017f50414420546f6b656e0000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250836040518060400160405280600981526020017f50414420546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f504144000000000000000000000000000000000000000000000000000000000081525081600390816200012391906200077f565b5080600490816200013591906200077f565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001a4919062000877565b60405180910390fd5b620001be816200027760201b60201c565b50620001d56006836200033d60201b90919060201c565b6101208181525050620001f36007826200033d60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a08181525050620002326200039560201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505062000a72565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060208351101562000363576200035b83620003f260201b60201c565b90506200038f565b8262000375836200045f60201b60201c565b60000190816200038691906200077f565b5060ff60001b90505b92915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e051610100514630604051602001620003d7959493929190620008c0565b60405160208183030381529060405280519060200120905090565b600080829050601f815111156200044257826040517f305a27a9000000000000000000000000000000000000000000000000000000008152600401620004399190620009ac565b60405180910390fd5b805181620004509062000a02565b60001c1760001b915050919050565b6000819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200049b826200046e565b9050919050565b620004ad816200048e565b8114620004b957600080fd5b50565b600081519050620004cd81620004a2565b92915050565b600060208284031215620004ec57620004eb62000469565b5b6000620004fc84828501620004bc565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200058757607f821691505b6020821081036200059d576200059c6200053f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005c8565b620006138683620005c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006606200065a62000654846200062b565b62000635565b6200062b565b9050919050565b6000819050919050565b6200067c836200063f565b620006946200068b8262000667565b848454620005d5565b825550505050565b600090565b620006ab6200069c565b620006b881848462000671565b505050565b5b81811015620006e057620006d4600082620006a1565b600181019050620006be565b5050565b601f8211156200072f57620006f981620005a3565b6200070484620005b8565b8101602085101562000714578190505b6200072c6200072385620005b8565b830182620006bd565b50505b505050565b600082821c905092915050565b6000620007546000198460080262000734565b1980831691505092915050565b60006200076f838362000741565b9150826002028217905092915050565b6200078a8262000505565b67ffffffffffffffff811115620007a657620007a562000510565b5b620007b282546200056e565b620007bf828285620006e4565b600060209050601f831160018114620007f75760008415620007e2578287015190505b620007ee858262000761565b8655506200085e565b601f1984166200080786620005a3565b60005b8281101562000831578489015182556001820191506020850194506020810190506200080a565b868310156200085157848901516200084d601f89168262000741565b8355505b6001600288020188555050505b505050505050565b62000871816200048e565b82525050565b60006020820190506200088e600083018462000866565b92915050565b6000819050919050565b620008a98162000894565b82525050565b620008ba816200062b565b82525050565b600060a082019050620008d760008301886200089e565b620008e660208301876200089e565b620008f560408301866200089e565b620009046060830185620008af565b62000913608083018462000866565b9695505050505050565b600082825260208201905092915050565b60005b838110156200094e57808201518184015260208101905062000931565b60008484015250505050565b6000601f19601f8301169050919050565b6000620009788262000505565b6200098481856200091d565b9350620009968185602086016200092e565b620009a1816200095a565b840191505092915050565b60006020820190508181036000830152620009c881846200096b565b905092915050565b600081519050919050565b6000819050602082019050919050565b6000620009f9825162000894565b80915050919050565b600062000a0f82620009d0565b8262000a1b84620009db565b905062000a2881620009eb565b9250602082101562000a6b5762000a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802620005c8565b831692505b5050919050565b60805160a05160c05160e051610100516101205161014051611f5c62000acd6000396000610d8301526000610d48015260006112980152600061127701526000610a7401526000610aca01526000610af30152611f5c6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a257806395d89b411161007157806395d89b41146102b0578063a9059cbb146102ce578063d505accf146102fe578063dd62ed3e1461031a578063f2fde38b1461034a5761010b565b8063715018a6146102345780637ecebe001461023e57806384b0196e1461026e5780638da5cb5b146102925761010b565b8063313ce567116100de578063313ce567146101ac5780633644e515146101ca57806340c10f19146101e857806370a08231146102045761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610366565b6040516101259190611785565b60405180910390f35b61014860048036038101906101439190611840565b6103f8565b604051610155919061189b565b60405180910390f35b61016661041b565b60405161017391906118c5565b60405180910390f35b610196600480360381019061019191906118e0565b610425565b6040516101a3919061189b565b60405180910390f35b6101b4610454565b6040516101c1919061194f565b60405180910390f35b6101d261045d565b6040516101df9190611983565b60405180910390f35b61020260048036038101906101fd9190611840565b61046c565b005b61021e6004803603810190610219919061199e565b610482565b60405161022b91906118c5565b60405180910390f35b61023c6104ca565b005b6102586004803603810190610253919061199e565b6104de565b60405161026591906118c5565b60405180910390f35b6102766104f0565b6040516102899796959493929190611ad3565b60405180910390f35b61029a61059a565b6040516102a79190611b57565b60405180910390f35b6102b86105c4565b6040516102c59190611785565b60405180910390f35b6102e860048036038101906102e39190611840565b610656565b6040516102f5919061189b565b60405180910390f35b61031860048036038101906103139190611bca565b610679565b005b610334600480360381019061032f9190611c6c565b6107c1565b60405161034191906118c5565b60405180910390f35b610364600480360381019061035f919061199e565b610848565b005b60606003805461037590611cdb565b80601f01602080910402602001604051908101604052809291908181526020018280546103a190611cdb565b80156103ee5780601f106103c3576101008083540402835291602001916103ee565b820191906000526020600020905b8154815290600101906020018083116103d157829003601f168201915b5050505050905090565b6000806104036108ce565b90506104108185856108d6565b600191505092915050565b6000600254905090565b6000806104306108ce565b905061043d8582856108e8565b61044885858561097c565b60019150509392505050565b60006012905090565b6000610467610a70565b905090565b610474610b27565b61047e8282610bae565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6104d2610b27565b6104dc6000610c30565b565b60006104e982610cf6565b9050919050565b600060608060008060006060610504610d3f565b61050c610d7a565b46306000801b600067ffffffffffffffff81111561052d5761052c611d0c565b5b60405190808252806020026020018201604052801561055b5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105d390611cdb565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611cdb565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b6000806106616108ce565b905061066e81858561097c565b600191505092915050565b834211156106be57836040517f627913020000000000000000000000000000000000000000000000000000000081526004016106b591906118c5565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106ed8c610db5565b8960405160200161070396959493929190611d3b565b604051602081830303815290604052805190602001209050600061072682610e0c565b9050600061073682878787610e26565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107aa57808a6040517f4b800e460000000000000000000000000000000000000000000000000000000081526004016107a1929190611d9c565b60405180910390fd5b6107b58a8a8a6108d6565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610850610b27565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108c25760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016108b99190611b57565b60405180910390fd5b6108cb81610c30565b50565b600033905090565b6108e38383836001610e56565b505050565b60006108f484846107c1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109765781811015610966578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161095d93929190611dc5565b60405180910390fd5b61097584848484036000610e56565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109ee5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016109e59190611b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a605760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610a579190611b57565b60405180910390fd5b610a6b83838361102d565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610aec57507f000000000000000000000000000000000000000000000000000000000000000046145b15610b19577f00000000000000000000000000000000000000000000000000000000000000009050610b24565b610b21611252565b90505b90565b610b2f6108ce565b73ffffffffffffffffffffffffffffffffffffffff16610b4d61059a565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57610b706108ce565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ba39190611b57565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c205760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c179190611b57565b60405180910390fd5b610c2c6000838361102d565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610d7560067f00000000000000000000000000000000000000000000000000000000000000006112e890919063ffffffff16565b905090565b6060610db060077f00000000000000000000000000000000000000000000000000000000000000006112e890919063ffffffff16565b905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050559050919050565b6000610e1f610e19610a70565b83611398565b9050919050565b600080600080610e38888888886113d9565b925092509250610e4882826114cd565b829350505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610ec85760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ebf9190611b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f3a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610f319190611b57565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611027578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161101e91906118c5565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361107f5780600260008282546110739190611e2b565b92505081905550611152565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561110b578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161110293929190611dc5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119b57806002600082825403925050819055506111e8565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124591906118c5565b60405180910390a3505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016112cd959493929190611e5f565b60405160208183030381529060405280519060200120905090565b606060ff60001b8314611305576112fe83611631565b9050611392565b81805461131190611cdb565b80601f016020809104026020016040519081016040528092919081815260200182805461133d90611cdb565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b505050505090505b92915050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156114195760006003859250925092506114c3565b60006001888888886040516000815260200160405260405161143e9493929190611eb2565b6020604051602081039080840390855afa158015611460573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b457600060016000801b935093509350506114c3565b8060008060001b935093509350505b9450945094915050565b600060038111156114e1576114e0611ef7565b5b8260038111156114f4576114f3611ef7565b5b031561162d576001600381111561150e5761150d611ef7565b5b82600381111561152157611520611ef7565b5b03611558576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561156c5761156b611ef7565b5b82600381111561157f5761157e611ef7565b5b036115c4578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016115bb91906118c5565b60405180910390fd5b6003808111156115d7576115d6611ef7565b5b8260038111156115ea576115e9611ef7565b5b0361162c57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016116239190611983565b60405180910390fd5b5b5050565b6060600061163e836116a5565b90506000602067ffffffffffffffff81111561165d5761165c611d0c565b5b6040519080825280601f01601f19166020018201604052801561168f5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b60008060ff8360001c169050601f8111156116ec576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561172f578082015181840152602081019050611714565b60008484015250505050565b6000601f19601f8301169050919050565b6000611757826116f5565b6117618185611700565b9350611771818560208601611711565b61177a8161173b565b840191505092915050565b6000602082019050818103600083015261179f818461174c565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117d7826117ac565b9050919050565b6117e7816117cc565b81146117f257600080fd5b50565b600081359050611804816117de565b92915050565b6000819050919050565b61181d8161180a565b811461182857600080fd5b50565b60008135905061183a81611814565b92915050565b60008060408385031215611857576118566117a7565b5b6000611865858286016117f5565b92505060206118768582860161182b565b9150509250929050565b60008115159050919050565b61189581611880565b82525050565b60006020820190506118b0600083018461188c565b92915050565b6118bf8161180a565b82525050565b60006020820190506118da60008301846118b6565b92915050565b6000806000606084860312156118f9576118f86117a7565b5b6000611907868287016117f5565b9350506020611918868287016117f5565b92505060406119298682870161182b565b9150509250925092565b600060ff82169050919050565b61194981611933565b82525050565b60006020820190506119646000830184611940565b92915050565b6000819050919050565b61197d8161196a565b82525050565b60006020820190506119986000830184611974565b92915050565b6000602082840312156119b4576119b36117a7565b5b60006119c2848285016117f5565b91505092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a00816119cb565b82525050565b611a0f816117cc565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a4a8161180a565b82525050565b6000611a5c8383611a41565b60208301905092915050565b6000602082019050919050565b6000611a8082611a15565b611a8a8185611a20565b9350611a9583611a31565b8060005b83811015611ac6578151611aad8882611a50565b9750611ab883611a68565b925050600181019050611a99565b5085935050505092915050565b600060e082019050611ae8600083018a6119f7565b8181036020830152611afa818961174c565b90508181036040830152611b0e818861174c565b9050611b1d60608301876118b6565b611b2a6080830186611a06565b611b3760a0830185611974565b81810360c0830152611b498184611a75565b905098975050505050505050565b6000602082019050611b6c6000830184611a06565b92915050565b611b7b81611933565b8114611b8657600080fd5b50565b600081359050611b9881611b72565b92915050565b611ba78161196a565b8114611bb257600080fd5b50565b600081359050611bc481611b9e565b92915050565b600080600080600080600060e0888a031215611be957611be86117a7565b5b6000611bf78a828b016117f5565b9750506020611c088a828b016117f5565b9650506040611c198a828b0161182b565b9550506060611c2a8a828b0161182b565b9450506080611c3b8a828b01611b89565b93505060a0611c4c8a828b01611bb5565b92505060c0611c5d8a828b01611bb5565b91505092959891949750929550565b60008060408385031215611c8357611c826117a7565b5b6000611c91858286016117f5565b9250506020611ca2858286016117f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611cf357607f821691505b602082108103611d0657611d05611cac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060c082019050611d506000830189611974565b611d5d6020830188611a06565b611d6a6040830187611a06565b611d7760608301866118b6565b611d8460808301856118b6565b611d9160a08301846118b6565b979650505050505050565b6000604082019050611db16000830185611a06565b611dbe6020830184611a06565b9392505050565b6000606082019050611dda6000830186611a06565b611de760208301856118b6565b611df460408301846118b6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e368261180a565b9150611e418361180a565b9250828201905080821115611e5957611e58611dfc565b5b92915050565b600060a082019050611e746000830188611974565b611e816020830187611974565b611e8e6040830186611974565b611e9b60608301856118b6565b611ea86080830184611a06565b9695505050505050565b6000608082019050611ec76000830187611974565b611ed46020830186611940565b611ee16040830185611974565b611eee6060830184611974565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea26469706673582212206297b56840db1d0b1cd745ba6d612125a1507b6563b8cbee9e81ca1aed1cdbe764736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a257806395d89b411161007157806395d89b41146102b0578063a9059cbb146102ce578063d505accf146102fe578063dd62ed3e1461031a578063f2fde38b1461034a5761010b565b8063715018a6146102345780637ecebe001461023e57806384b0196e1461026e5780638da5cb5b146102925761010b565b8063313ce567116100de578063313ce567146101ac5780633644e515146101ca57806340c10f19146101e857806370a08231146102045761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610366565b6040516101259190611785565b60405180910390f35b61014860048036038101906101439190611840565b6103f8565b604051610155919061189b565b60405180910390f35b61016661041b565b60405161017391906118c5565b60405180910390f35b610196600480360381019061019191906118e0565b610425565b6040516101a3919061189b565b60405180910390f35b6101b4610454565b6040516101c1919061194f565b60405180910390f35b6101d261045d565b6040516101df9190611983565b60405180910390f35b61020260048036038101906101fd9190611840565b61046c565b005b61021e6004803603810190610219919061199e565b610482565b60405161022b91906118c5565b60405180910390f35b61023c6104ca565b005b6102586004803603810190610253919061199e565b6104de565b60405161026591906118c5565b60405180910390f35b6102766104f0565b6040516102899796959493929190611ad3565b60405180910390f35b61029a61059a565b6040516102a79190611b57565b60405180910390f35b6102b86105c4565b6040516102c59190611785565b60405180910390f35b6102e860048036038101906102e39190611840565b610656565b6040516102f5919061189b565b60405180910390f35b61031860048036038101906103139190611bca565b610679565b005b610334600480360381019061032f9190611c6c565b6107c1565b60405161034191906118c5565b60405180910390f35b610364600480360381019061035f919061199e565b610848565b005b60606003805461037590611cdb565b80601f01602080910402602001604051908101604052809291908181526020018280546103a190611cdb565b80156103ee5780601f106103c3576101008083540402835291602001916103ee565b820191906000526020600020905b8154815290600101906020018083116103d157829003601f168201915b5050505050905090565b6000806104036108ce565b90506104108185856108d6565b600191505092915050565b6000600254905090565b6000806104306108ce565b905061043d8582856108e8565b61044885858561097c565b60019150509392505050565b60006012905090565b6000610467610a70565b905090565b610474610b27565b61047e8282610bae565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6104d2610b27565b6104dc6000610c30565b565b60006104e982610cf6565b9050919050565b600060608060008060006060610504610d3f565b61050c610d7a565b46306000801b600067ffffffffffffffff81111561052d5761052c611d0c565b5b60405190808252806020026020018201604052801561055b5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105d390611cdb565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611cdb565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b6000806106616108ce565b905061066e81858561097c565b600191505092915050565b834211156106be57836040517f627913020000000000000000000000000000000000000000000000000000000081526004016106b591906118c5565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106ed8c610db5565b8960405160200161070396959493929190611d3b565b604051602081830303815290604052805190602001209050600061072682610e0c565b9050600061073682878787610e26565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107aa57808a6040517f4b800e460000000000000000000000000000000000000000000000000000000081526004016107a1929190611d9c565b60405180910390fd5b6107b58a8a8a6108d6565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610850610b27565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108c25760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016108b99190611b57565b60405180910390fd5b6108cb81610c30565b50565b600033905090565b6108e38383836001610e56565b505050565b60006108f484846107c1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109765781811015610966578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161095d93929190611dc5565b60405180910390fd5b61097584848484036000610e56565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109ee5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016109e59190611b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a605760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610a579190611b57565b60405180910390fd5b610a6b83838361102d565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610aec57507f000000000000000000000000000000000000000000000000000000000000000046145b15610b19577f00000000000000000000000000000000000000000000000000000000000000009050610b24565b610b21611252565b90505b90565b610b2f6108ce565b73ffffffffffffffffffffffffffffffffffffffff16610b4d61059a565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57610b706108ce565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ba39190611b57565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c205760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c179190611b57565b60405180910390fd5b610c2c6000838361102d565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610d7560067f00000000000000000000000000000000000000000000000000000000000000006112e890919063ffffffff16565b905090565b6060610db060077f00000000000000000000000000000000000000000000000000000000000000006112e890919063ffffffff16565b905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050559050919050565b6000610e1f610e19610a70565b83611398565b9050919050565b600080600080610e38888888886113d9565b925092509250610e4882826114cd565b829350505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610ec85760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ebf9190611b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f3a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610f319190611b57565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611027578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161101e91906118c5565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361107f5780600260008282546110739190611e2b565b92505081905550611152565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561110b578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161110293929190611dc5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119b57806002600082825403925050819055506111e8565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124591906118c5565b60405180910390a3505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016112cd959493929190611e5f565b60405160208183030381529060405280519060200120905090565b606060ff60001b8314611305576112fe83611631565b9050611392565b81805461131190611cdb565b80601f016020809104026020016040519081016040528092919081815260200182805461133d90611cdb565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b505050505090505b92915050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156114195760006003859250925092506114c3565b60006001888888886040516000815260200160405260405161143e9493929190611eb2565b6020604051602081039080840390855afa158015611460573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b457600060016000801b935093509350506114c3565b8060008060001b935093509350505b9450945094915050565b600060038111156114e1576114e0611ef7565b5b8260038111156114f4576114f3611ef7565b5b031561162d576001600381111561150e5761150d611ef7565b5b82600381111561152157611520611ef7565b5b03611558576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561156c5761156b611ef7565b5b82600381111561157f5761157e611ef7565b5b036115c4578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016115bb91906118c5565b60405180910390fd5b6003808111156115d7576115d6611ef7565b5b8260038111156115ea576115e9611ef7565b5b0361162c57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016116239190611983565b60405180910390fd5b5b5050565b6060600061163e836116a5565b90506000602067ffffffffffffffff81111561165d5761165c611d0c565b5b6040519080825280601f01601f19166020018201604052801561168f5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b60008060ff8360001c169050601f8111156116ec576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561172f578082015181840152602081019050611714565b60008484015250505050565b6000601f19601f8301169050919050565b6000611757826116f5565b6117618185611700565b9350611771818560208601611711565b61177a8161173b565b840191505092915050565b6000602082019050818103600083015261179f818461174c565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117d7826117ac565b9050919050565b6117e7816117cc565b81146117f257600080fd5b50565b600081359050611804816117de565b92915050565b6000819050919050565b61181d8161180a565b811461182857600080fd5b50565b60008135905061183a81611814565b92915050565b60008060408385031215611857576118566117a7565b5b6000611865858286016117f5565b92505060206118768582860161182b565b9150509250929050565b60008115159050919050565b61189581611880565b82525050565b60006020820190506118b0600083018461188c565b92915050565b6118bf8161180a565b82525050565b60006020820190506118da60008301846118b6565b92915050565b6000806000606084860312156118f9576118f86117a7565b5b6000611907868287016117f5565b9350506020611918868287016117f5565b92505060406119298682870161182b565b9150509250925092565b600060ff82169050919050565b61194981611933565b82525050565b60006020820190506119646000830184611940565b92915050565b6000819050919050565b61197d8161196a565b82525050565b60006020820190506119986000830184611974565b92915050565b6000602082840312156119b4576119b36117a7565b5b60006119c2848285016117f5565b91505092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a00816119cb565b82525050565b611a0f816117cc565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a4a8161180a565b82525050565b6000611a5c8383611a41565b60208301905092915050565b6000602082019050919050565b6000611a8082611a15565b611a8a8185611a20565b9350611a9583611a31565b8060005b83811015611ac6578151611aad8882611a50565b9750611ab883611a68565b925050600181019050611a99565b5085935050505092915050565b600060e082019050611ae8600083018a6119f7565b8181036020830152611afa818961174c565b90508181036040830152611b0e818861174c565b9050611b1d60608301876118b6565b611b2a6080830186611a06565b611b3760a0830185611974565b81810360c0830152611b498184611a75565b905098975050505050505050565b6000602082019050611b6c6000830184611a06565b92915050565b611b7b81611933565b8114611b8657600080fd5b50565b600081359050611b9881611b72565b92915050565b611ba78161196a565b8114611bb257600080fd5b50565b600081359050611bc481611b9e565b92915050565b600080600080600080600060e0888a031215611be957611be86117a7565b5b6000611bf78a828b016117f5565b9750506020611c088a828b016117f5565b9650506040611c198a828b0161182b565b9550506060611c2a8a828b0161182b565b9450506080611c3b8a828b01611b89565b93505060a0611c4c8a828b01611bb5565b92505060c0611c5d8a828b01611bb5565b91505092959891949750929550565b60008060408385031215611c8357611c826117a7565b5b6000611c91858286016117f5565b9250506020611ca2858286016117f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611cf357607f821691505b602082108103611d0657611d05611cac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060c082019050611d506000830189611974565b611d5d6020830188611a06565b611d6a6040830187611a06565b611d7760608301866118b6565b611d8460808301856118b6565b611d9160a08301846118b6565b979650505050505050565b6000604082019050611db16000830185611a06565b611dbe6020830184611a06565b9392505050565b6000606082019050611dda6000830186611a06565b611de760208301856118b6565b611df460408301846118b6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e368261180a565b9150611e418361180a565b9250828201905080821115611e5957611e58611dfc565b5b92915050565b600060a082019050611e746000830188611974565b611e816020830187611974565b611e8e6040830186611974565b611e9b60608301856118b6565b611ea86080830184611a06565b9695505050505050565b6000608082019050611ec76000830187611974565b611ed46020830186611940565b611ee16040830185611974565b611eee6060830184611974565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea26469706673582212206297b56840db1d0b1cd745ba6d612125a1507b6563b8cbee9e81ca1aed1cdbe764736f6c63430008180033", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200187638038062001876833981810160405281019062000037919062000288565b806040518060400160405280600981526020017f50414420546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f50414400000000000000000000000000000000000000000000000000000000008152508160039081620000b5919062000534565b508060049081620000c7919062000534565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013f5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200013691906200062c565b60405180910390fd5b62000150816200015860201b60201c565b505062000649565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002508262000223565b9050919050565b620002628162000243565b81146200026e57600080fd5b50565b600081519050620002828162000257565b92915050565b600060208284031215620002a157620002a06200021e565b5b6000620002b18482850162000271565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033c57607f821691505b602082108103620003525762000351620002f4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200037d565b620003c886836200037d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004156200040f6200040984620003e0565b620003ea565b620003e0565b9050919050565b6000819050919050565b6200043183620003f4565b6200044962000440826200041c565b8484546200038a565b825550505050565b600090565b6200046062000451565b6200046d81848462000426565b505050565b5b8181101562000495576200048960008262000456565b60018101905062000473565b5050565b601f821115620004e457620004ae8162000358565b620004b9846200036d565b81016020851015620004c9578190505b620004e1620004d8856200036d565b83018262000472565b50505b505050565b600082821c905092915050565b60006200050960001984600802620004e9565b1980831691505092915050565b6000620005248383620004f6565b9150826002028217905092915050565b6200053f82620002ba565b67ffffffffffffffff8111156200055b576200055a620002c5565b5b62000567825462000323565b6200057482828562000499565b600060209050601f831160018114620005ac576000841562000597578287015190505b620005a3858262000516565b86555062000613565b601f198416620005bc8662000358565b60005b82811015620005e657848901518255600182019150602085019450602081019050620005bf565b8683101562000606578489015162000602601f891682620004f6565b8355505b6001600288020188555050505b505050505050565b620006268162000243565b82525050565b60006020820190506200064360008301846200061b565b92915050565b61121d80620006596000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b411461024d578063a9059cbb1461026b578063dd62ed3e1461029b578063f2fde38b146102cb576100ea565b806370a08231146101f5578063715018a6146102255780638da5cb5b1461022f576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806340c10f19146101a9578063571ac8b0146101c5576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102e7565b6040516101049190610e71565b60405180910390f35b61012760048036038101906101229190610f2c565b610379565b6040516101349190610f87565b60405180910390f35b61014561039c565b6040516101529190610fb1565b60405180910390f35b61017560048036038101906101709190610fcc565b6103a6565b6040516101829190610f87565b60405180910390f35b6101936103d5565b6040516101a0919061103b565b60405180910390f35b6101c360048036038101906101be9190610f2c565b6103de565b005b6101df60048036038101906101da9190611056565b6103f4565b6040516101ec9190610f87565b60405180910390f35b61020f600480360381019061020a9190611056565b61042c565b60405161021c9190610fb1565b60405180910390f35b61022d610474565b005b610237610488565b6040516102449190611092565b60405180910390f35b6102556104b2565b6040516102629190610e71565b60405180910390f35b61028560048036038101906102809190610f2c565b610544565b6040516102929190610f87565b60405180910390f35b6102b560048036038101906102b091906110ad565b610567565b6040516102c29190610fb1565b60405180910390f35b6102e560048036038101906102e09190611056565b6105ee565b005b6060600380546102f69061111c565b80601f01602080910402602001604051908101604052809291908181526020018280546103229061111c565b801561036f5780601f106103445761010080835404028352916020019161036f565b820191906000526020600020905b81548152906001019060200180831161035257829003601f168201915b5050505050905090565b600080610384610674565b905061039181858561067c565b600191505092915050565b6000600254905090565b6000806103b1610674565b90506103be85828561068e565b6103c9858585610722565b60019150509392505050565b60006012905090565b6103e6610816565b6103f0828261089d565b5050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506104248382610379565b915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047c610816565b610486600061091f565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546104c19061111c565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061111c565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b60008061054f610674565b905061055c818585610722565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6105f6610816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106685760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065f9190611092565b60405180910390fd5b6106718161091f565b50565b600033905090565b61068983838360016109e5565b505050565b600061069a8484610567565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461071c578181101561070c578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016107039392919061114d565b60405180910390fd5b61071b848484840360006109e5565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107945760006040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161078b9190611092565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108065760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107fd9190611092565b60405180910390fd5b610811838383610bbc565b505050565b61081e610674565b73ffffffffffffffffffffffffffffffffffffffff1661083c610488565b73ffffffffffffffffffffffffffffffffffffffff161461089b5761085f610674565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016108929190611092565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361090f5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109069190611092565b60405180910390fd5b61091b60008383610bbc565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a575760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610a4e9190611092565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ac95760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ac09190611092565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610bb6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bad9190610fb1565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c0e578060026000828254610c0291906111b3565b92505081905550610ce1565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610c9a578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610c919392919061114d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2a5780600260008282540392505081905550610d77565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd49190610fb1565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e1b578082015181840152602081019050610e00565b60008484015250505050565b6000601f19601f8301169050919050565b6000610e4382610de1565b610e4d8185610dec565b9350610e5d818560208601610dfd565b610e6681610e27565b840191505092915050565b60006020820190508181036000830152610e8b8184610e38565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ec382610e98565b9050919050565b610ed381610eb8565b8114610ede57600080fd5b50565b600081359050610ef081610eca565b92915050565b6000819050919050565b610f0981610ef6565b8114610f1457600080fd5b50565b600081359050610f2681610f00565b92915050565b60008060408385031215610f4357610f42610e93565b5b6000610f5185828601610ee1565b9250506020610f6285828601610f17565b9150509250929050565b60008115159050919050565b610f8181610f6c565b82525050565b6000602082019050610f9c6000830184610f78565b92915050565b610fab81610ef6565b82525050565b6000602082019050610fc66000830184610fa2565b92915050565b600080600060608486031215610fe557610fe4610e93565b5b6000610ff386828701610ee1565b935050602061100486828701610ee1565b925050604061101586828701610f17565b9150509250925092565b600060ff82169050919050565b6110358161101f565b82525050565b6000602082019050611050600083018461102c565b92915050565b60006020828403121561106c5761106b610e93565b5b600061107a84828501610ee1565b91505092915050565b61108c81610eb8565b82525050565b60006020820190506110a76000830184611083565b92915050565b600080604083850312156110c4576110c3610e93565b5b60006110d285828601610ee1565b92505060206110e385828601610ee1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061113457607f821691505b602082108103611147576111466110ed565b5b50919050565b60006060820190506111626000830186611083565b61116f6020830185610fa2565b61117c6040830184610fa2565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006111be82610ef6565b91506111c983610ef6565b92508282019050808211156111e1576111e0611184565b5b9291505056fea2646970667358221220bb7b723a32597fb3ddc26b08b382e44995f7813e537cfe0a1dbeedcdb295937d64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b411461024d578063a9059cbb1461026b578063dd62ed3e1461029b578063f2fde38b146102cb576100ea565b806370a08231146101f5578063715018a6146102255780638da5cb5b1461022f576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806340c10f19146101a9578063571ac8b0146101c5576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102e7565b6040516101049190610e71565b60405180910390f35b61012760048036038101906101229190610f2c565b610379565b6040516101349190610f87565b60405180910390f35b61014561039c565b6040516101529190610fb1565b60405180910390f35b61017560048036038101906101709190610fcc565b6103a6565b6040516101829190610f87565b60405180910390f35b6101936103d5565b6040516101a0919061103b565b60405180910390f35b6101c360048036038101906101be9190610f2c565b6103de565b005b6101df60048036038101906101da9190611056565b6103f4565b6040516101ec9190610f87565b60405180910390f35b61020f600480360381019061020a9190611056565b61042c565b60405161021c9190610fb1565b60405180910390f35b61022d610474565b005b610237610488565b6040516102449190611092565b60405180910390f35b6102556104b2565b6040516102629190610e71565b60405180910390f35b61028560048036038101906102809190610f2c565b610544565b6040516102929190610f87565b60405180910390f35b6102b560048036038101906102b091906110ad565b610567565b6040516102c29190610fb1565b60405180910390f35b6102e560048036038101906102e09190611056565b6105ee565b005b6060600380546102f69061111c565b80601f01602080910402602001604051908101604052809291908181526020018280546103229061111c565b801561036f5780601f106103445761010080835404028352916020019161036f565b820191906000526020600020905b81548152906001019060200180831161035257829003601f168201915b5050505050905090565b600080610384610674565b905061039181858561067c565b600191505092915050565b6000600254905090565b6000806103b1610674565b90506103be85828561068e565b6103c9858585610722565b60019150509392505050565b60006012905090565b6103e6610816565b6103f0828261089d565b5050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506104248382610379565b915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047c610816565b610486600061091f565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546104c19061111c565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061111c565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b60008061054f610674565b905061055c818585610722565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6105f6610816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106685760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065f9190611092565b60405180910390fd5b6106718161091f565b50565b600033905090565b61068983838360016109e5565b505050565b600061069a8484610567565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461071c578181101561070c578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016107039392919061114d565b60405180910390fd5b61071b848484840360006109e5565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107945760006040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161078b9190611092565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108065760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107fd9190611092565b60405180910390fd5b610811838383610bbc565b505050565b61081e610674565b73ffffffffffffffffffffffffffffffffffffffff1661083c610488565b73ffffffffffffffffffffffffffffffffffffffff161461089b5761085f610674565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016108929190611092565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361090f5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109069190611092565b60405180910390fd5b61091b60008383610bbc565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a575760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610a4e9190611092565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ac95760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ac09190611092565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610bb6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bad9190610fb1565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c0e578060026000828254610c0291906111b3565b92505081905550610ce1565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610c9a578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610c919392919061114d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2a5780600260008282540392505081905550610d77565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd49190610fb1565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e1b578082015181840152602081019050610e00565b60008484015250505050565b6000601f19601f8301169050919050565b6000610e4382610de1565b610e4d8185610dec565b9350610e5d818560208601610dfd565b610e6681610e27565b840191505092915050565b60006020820190508181036000830152610e8b8184610e38565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ec382610e98565b9050919050565b610ed381610eb8565b8114610ede57600080fd5b50565b600081359050610ef081610eca565b92915050565b6000819050919050565b610f0981610ef6565b8114610f1457600080fd5b50565b600081359050610f2681610f00565b92915050565b60008060408385031215610f4357610f42610e93565b5b6000610f5185828601610ee1565b9250506020610f6285828601610f17565b9150509250929050565b60008115159050919050565b610f8181610f6c565b82525050565b6000602082019050610f9c6000830184610f78565b92915050565b610fab81610ef6565b82525050565b6000602082019050610fc66000830184610fa2565b92915050565b600080600060608486031215610fe557610fe4610e93565b5b6000610ff386828701610ee1565b935050602061100486828701610ee1565b925050604061101586828701610f17565b9150509250925092565b600060ff82169050919050565b6110358161101f565b82525050565b6000602082019050611050600083018461102c565b92915050565b60006020828403121561106c5761106b610e93565b5b600061107a84828501610ee1565b91505092915050565b61108c81610eb8565b82525050565b60006020820190506110a76000830184611083565b92915050565b600080604083850312156110c4576110c3610e93565b5b60006110d285828601610ee1565b92505060206110e385828601610ee1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061113457607f821691505b602082108103611147576111466110ed565b5b50919050565b60006060820190506111626000830186611083565b61116f6020830185610fa2565b61117c6040830184610fa2565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006111be82610ef6565b91506111c983610ef6565b92508282019050808211156111e1576111e0611184565b5b9291505056fea2646970667358221220bb7b723a32597fb3ddc26b08b382e44995f7813e537cfe0a1dbeedcdb295937d64736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } \ No newline at end of file diff --git a/frontend/src/evm-output/PADTokenStake.artifacts.json b/frontend/src/evm-output/PADTokenStake.artifacts.json new file mode 100644 index 0000000..0a528ad --- /dev/null +++ b/frontend/src/evm-output/PADTokenStake.artifacts.json @@ -0,0 +1,128 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PADTokenStake", + "sourceName": "contracts/PADTokenStake.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract PADToken", + "name": "_padToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "getDeposit", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasedAt", + "type": "uint256" + } + ], + "internalType": "struct PADTokenStake.Deposit", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], + "name": "getWithdrawPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptPenaltyCut", + "type": "bool" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a0604052600060025560006003553480156200001b57600080fd5b5060405162000e7038038062000e708339818101604052810190620000419190620001e5565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620000856200008c60201b60201c565b506200029d565b60405180606001604052806002548152602001601e8152602001601981525060008080815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060026000815480929190620000f39062000250565b919050555060405180606001604052806002548152602001603c815260200160328152506000806001815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060026000815480929190620001609062000250565b9190505550565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000199826200016c565b9050919050565b6000620001ad826200018c565b9050919050565b620001bf81620001a0565b8114620001cb57600080fd5b50565b600081519050620001df81620001b4565b92915050565b600060208284031215620001fe57620001fd62000167565b5b60006200020e84828501620001ce565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006200025d8262000246565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000292576200029162000217565b5b600182019050919050565b608051610bb7620002b960003960006101c10152610bb76000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806338d07436146100515780633a140b9d1461006d5780637b0472f01461009d5780639f9fb968146100b9575b600080fd5b61006b600480360381019061006691906106ad565b6100e9565b005b610087600480360381019061008291906106ed565b61026a565b6040516100949190610729565b60405180910390f35b6100b760048036038101906100b29190610744565b6102ab565b005b6100d360048036038101906100ce91906106ed565b61043a565b6040516100e0919061084f565b60405180910390f35b60006100f48361026a565b90506000811115610140578161013f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610136906108ed565b60405180910390fd5b5b600061014b8461043a565b9050600080600083604001518152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000836064836040015185606001516101a9919061093c565b6101b391906109ad565b6101bd91906109de565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8460200151836040518363ffffffff1660e01b815260040161021e929190610a21565b6020604051808303816000875af115801561023d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102619190610a5f565b50505050505050565b6000806102768361043a565b90506000428260a0015161028a91906109de565b90506000811161029f576000925050506102a6565b6064925050505b919050565b60008060008481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905060006040518060c0016040528060035481526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001428152602001620151808460200151610340919061093c565b4261034b9190610a8c565b8152509050600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050565b6104426105ee565b61044a6105ee565b60005b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156105ad57600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106104e8576104e7610ac0565b5b90600052602060002090600602016040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815250509150838260000151036105a05781925050506105e9565b808060010191505061044d565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e090610b61565b60405180910390fd5b919050565b6040518060c0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b600080fd5b6000819050919050565b6106528161063f565b811461065d57600080fd5b50565b60008135905061066f81610649565b92915050565b60008115159050919050565b61068a81610675565b811461069557600080fd5b50565b6000813590506106a781610681565b92915050565b600080604083850312156106c4576106c361063a565b5b60006106d285828601610660565b92505060206106e385828601610698565b9150509250929050565b6000602082840312156107035761070261063a565b5b600061071184828501610660565b91505092915050565b6107238161063f565b82525050565b600060208201905061073e600083018461071a565b92915050565b6000806040838503121561075b5761075a61063a565b5b600061076985828601610660565b925050602061077a85828601610660565b9150509250929050565b61078d8161063f565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006107be82610793565b9050919050565b6107ce816107b3565b82525050565b60c0820160008201516107ea6000850182610784565b5060208201516107fd60208501826107c5565b5060408201516108106040850182610784565b5060608201516108236060850182610784565b5060808201516108366080850182610784565b5060a082015161084960a0850182610784565b50505050565b600060c08201905061086460008301846107d4565b92915050565b600082825260208201905092915050565b7f596f752073686f756c6420616363657074207468652070656e616c747920637560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b60006108d760228361086a565b91506108e28261087b565b604082019050919050565b60006020820190508181036000830152610906816108ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109478261063f565b91506109528361063f565b92508282026109608161063f565b915082820484148315176109775761097661090d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006109b88261063f565b91506109c38361063f565b9250826109d3576109d261097e565b5b828204905092915050565b60006109e98261063f565b91506109f48361063f565b9250828203905081811115610a0c57610a0b61090d565b5b92915050565b610a1b816107b3565b82525050565b6000604082019050610a366000830185610a12565b610a43602083018461071a565b9392505050565b600081519050610a5981610681565b92915050565b600060208284031215610a7557610a7461063a565b5b6000610a8384828501610a4a565b91505092915050565b6000610a978261063f565b9150610aa28361063f565b9250828201905080821115610aba57610ab961090d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4465706f73697420776974682074686520676976656e204944206e6f7420666f60008201527f756e642e00000000000000000000000000000000000000000000000000000000602082015250565b6000610b4b60248361086a565b9150610b5682610aef565b604082019050919050565b60006020820190508181036000830152610b7a81610b3e565b905091905056fea2646970667358221220bb7d26cd403bb136957890911eef51151abf24d7b5fd5e3c365f650206acdb1564736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806338d07436146100515780633a140b9d1461006d5780637b0472f01461009d5780639f9fb968146100b9575b600080fd5b61006b600480360381019061006691906106ad565b6100e9565b005b610087600480360381019061008291906106ed565b61026a565b6040516100949190610729565b60405180910390f35b6100b760048036038101906100b29190610744565b6102ab565b005b6100d360048036038101906100ce91906106ed565b61043a565b6040516100e0919061084f565b60405180910390f35b60006100f48361026a565b90506000811115610140578161013f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610136906108ed565b60405180910390fd5b5b600061014b8461043a565b9050600080600083604001518152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000836064836040015185606001516101a9919061093c565b6101b391906109ad565b6101bd91906109de565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8460200151836040518363ffffffff1660e01b815260040161021e929190610a21565b6020604051808303816000875af115801561023d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102619190610a5f565b50505050505050565b6000806102768361043a565b90506000428260a0015161028a91906109de565b90506000811161029f576000925050506102a6565b6064925050505b919050565b60008060008481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905060006040518060c0016040528060035481526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001428152602001620151808460200151610340919061093c565b4261034b9190610a8c565b8152509050600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050565b6104426105ee565b61044a6105ee565b60005b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156105ad57600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106104e8576104e7610ac0565b5b90600052602060002090600602016040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815250509150838260000151036105a05781925050506105e9565b808060010191505061044d565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e090610b61565b60405180910390fd5b919050565b6040518060c0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b600080fd5b6000819050919050565b6106528161063f565b811461065d57600080fd5b50565b60008135905061066f81610649565b92915050565b60008115159050919050565b61068a81610675565b811461069557600080fd5b50565b6000813590506106a781610681565b92915050565b600080604083850312156106c4576106c361063a565b5b60006106d285828601610660565b92505060206106e385828601610698565b9150509250929050565b6000602082840312156107035761070261063a565b5b600061071184828501610660565b91505092915050565b6107238161063f565b82525050565b600060208201905061073e600083018461071a565b92915050565b6000806040838503121561075b5761075a61063a565b5b600061076985828601610660565b925050602061077a85828601610660565b9150509250929050565b61078d8161063f565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006107be82610793565b9050919050565b6107ce816107b3565b82525050565b60c0820160008201516107ea6000850182610784565b5060208201516107fd60208501826107c5565b5060408201516108106040850182610784565b5060608201516108236060850182610784565b5060808201516108366080850182610784565b5060a082015161084960a0850182610784565b50505050565b600060c08201905061086460008301846107d4565b92915050565b600082825260208201905092915050565b7f596f752073686f756c6420616363657074207468652070656e616c747920637560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b60006108d760228361086a565b91506108e28261087b565b604082019050919050565b60006020820190508181036000830152610906816108ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109478261063f565b91506109528361063f565b92508282026109608161063f565b915082820484148315176109775761097661090d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006109b88261063f565b91506109c38361063f565b9250826109d3576109d261097e565b5b828204905092915050565b60006109e98261063f565b91506109f48361063f565b9250828203905081811115610a0c57610a0b61090d565b5b92915050565b610a1b816107b3565b82525050565b6000604082019050610a366000830185610a12565b610a43602083018461071a565b9392505050565b600081519050610a5981610681565b92915050565b600060208284031215610a7557610a7461063a565b5b6000610a8384828501610a4a565b91505092915050565b6000610a978261063f565b9150610aa28361063f565b9250828201905080821115610aba57610ab961090d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4465706f73697420776974682074686520676976656e204944206e6f7420666f60008201527f756e642e00000000000000000000000000000000000000000000000000000000602082015250565b6000610b4b60248361086a565b9150610b5682610aef565b604082019050919050565b60006020820190508181036000830152610b7a81610b3e565b905091905056fea2646970667358221220bb7d26cd403bb136957890911eef51151abf24d7b5fd5e3c365f650206acdb1564736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/frontend/src/evm-output/deployed_addresses.json b/frontend/src/evm-output/deployed_addresses.json index 5882e35..a7cee76 100644 --- a/frontend/src/evm-output/deployed_addresses.json +++ b/frontend/src/evm-output/deployed_addresses.json @@ -1,4 +1,5 @@ { - "MainModule#MessageBox": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "MainModule#PADToken": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" + "MainModule#MessageBox": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F", + "MainModule#PADToken": "0x09635F643e140090A9A8Dcd712eD6285858ceBef", + "MainModule#PADTokenStake": "0xc5a5C42992dECbae36851359345FE25997F5C42d" } diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index ec3fbad..2b68e97 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -16,6 +16,7 @@ import { Route as rootRoute } from './routes/__root' // Create Virtual Routes +const PadTokenStakeLazyImport = createFileRoute('/pad-token-stake')() const PadTokenLazyImport = createFileRoute('/pad-token')() const MessageBoxLazyImport = createFileRoute('/message-box')() const AboutLazyImport = createFileRoute('/about')() @@ -23,6 +24,13 @@ const IndexLazyImport = createFileRoute('/')() // Create/Update Routes +const PadTokenStakeLazyRoute = PadTokenStakeLazyImport.update({ + path: '/pad-token-stake', + getParentRoute: () => rootRoute, +} as any).lazy(() => + import('./routes/pad-token-stake.lazy').then((d) => d.Route), +) + const PadTokenLazyRoute = PadTokenLazyImport.update({ path: '/pad-token', getParentRoute: () => rootRoute, @@ -63,6 +71,10 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PadTokenLazyImport parentRoute: typeof rootRoute } + '/pad-token-stake': { + preLoaderRoute: typeof PadTokenStakeLazyImport + parentRoute: typeof rootRoute + } } } @@ -73,6 +85,7 @@ export const routeTree = rootRoute.addChildren([ AboutLazyRoute, MessageBoxLazyRoute, PadTokenLazyRoute, + PadTokenStakeLazyRoute, ]) /* prettier-ignore-end */ diff --git a/frontend/src/routes/pad-token-stake.lazy.tsx b/frontend/src/routes/pad-token-stake.lazy.tsx new file mode 100644 index 0000000..17e95aa --- /dev/null +++ b/frontend/src/routes/pad-token-stake.lazy.tsx @@ -0,0 +1,74 @@ +import { createLazyFileRoute } from "@tanstack/react-router"; +import { useState } from "react"; +import { useStore } from "../store"; +import { toastError, tryWithToast } from "../utils/toast"; +import { formatPadTokenAmount } from "../utils/ui"; +import { padToken, padTokenStake } from "../web3"; + +export const Route = createLazyFileRoute("/pad-token-stake")({ + component: PadTokenStakePage, +}); + +function PadTokenStakePage() { + const connectedAccount = useStore((state) => state.connectedAccount); + const [allowance, setAllowance] = useState("(nothingness)"); + + const getAllowanceAmount = async () => { + if (!connectedAccount) { + toastError("Get Current Allowance", "Connect your wallet first."); + return; + } + + await tryWithToast("Get Current Allowance", async () => { + const owner = connectedAccount; + const spender = padTokenStake.options.address; + const allowance: bigint = await padToken.methods + .allowance(owner, spender) + .call(); + setAllowance(formatPadTokenAmount(allowance)); + }); + }; + + const approveMax = async () => { + if (!connectedAccount) { + toastError("Approve Max", "Connect your wallet first."); + return; + } + + await tryWithToast("Approve Max", async () => { + const owner = connectedAccount; + const spender = padTokenStake.options.address; + await padToken.methods.approveMax(spender).send({ from: owner }); + }); + }; + + return ( +
+
+
+

Allowance

+
+ + Allowance of PADTokenStake contract, for my PAD tokens: + {" "} + {allowance} +
+ + +
+
+
+ ); +} diff --git a/frontend/src/utils/ui.ts b/frontend/src/utils/ui.ts index a6705d4..5b0c163 100644 --- a/frontend/src/utils/ui.ts +++ b/frontend/src/utils/ui.ts @@ -5,5 +5,8 @@ export function shortenAddress(address: string) { } export function formatPadTokenAmount(amount: bigint) { + if (Number(amount) === Math.pow(2, 256)) { + return "∞ PAD"; + } return `${web3.utils.fromWei(amount, "ether").replace(/\.*$/, "")} PAD`; } diff --git a/frontend/src/web3.ts b/frontend/src/web3.ts index 2b7452e..ba36222 100644 --- a/frontend/src/web3.ts +++ b/frontend/src/web3.ts @@ -1,6 +1,7 @@ import { Web3 } from "web3"; import messageBoxArtifacts from "./evm-output/MessageBox.artifacts.json"; import padTokenArtifacts from "./evm-output/PADToken.artifacts.json"; +import padTokenStakeArtifacts from "./evm-output/PADTokenStake.artifacts.json"; import deployedAddresses from "./evm-output/deployed_addresses.json"; export let web3: Web3; @@ -23,3 +24,8 @@ export const padToken = new web3!.eth.Contract( padTokenArtifacts.abi, deployedAddresses["MainModule#PADToken"] ); + +export const padTokenStake = new web3!.eth.Contract( + padTokenStakeArtifacts.abi, + deployedAddresses["MainModule#PADTokenStake"] +);