diff --git a/src/components/SearchComponent.vue b/src/components/SearchComponent.vue index af592ef..5cff2b8 100644 --- a/src/components/SearchComponent.vue +++ b/src/components/SearchComponent.vue @@ -9,7 +9,7 @@ import blockchain from "../utils/blockchain"; // Store reference const etherStore = useEtherStore(); -const { walletAddress, depositList } = storeToRefs(etherStore); +const { walletAddress, depositsAddedList } = storeToRefs(etherStore); // Reactive state const tokenValue = ref(0); @@ -21,12 +21,13 @@ const selectedDeposit = ref(); // Emits const emit = defineEmits(["tokenBuy"]); -// Methods +// Blockchain methods const connectAccount = async () => { await blockchain.connectProvider(); verifyLiquidity(); }; +// Debounce methods const handleInputEvent = (event: any) => { const { value } = event.target; @@ -42,6 +43,8 @@ const handleInputEvent = (event: any) => { verifyLiquidity(); }; +// Enable button methods +// Check if has more than 2 decimal places const decimalCount = (num: Number) => { const numStr = String(num); if (numStr.includes(".")) { @@ -49,17 +52,15 @@ const decimalCount = (num: Number) => { } return 0; }; - +// Verify if there is a valid deposit to buy const verifyLiquidity = () => { enableSelectButton.value = false; selectedDeposit.value = null; - if (!walletAddress.value || tokenValue.value == 0) return; + if (!walletAddress.value || tokenValue.value <= 0) return; - const found = depositList.value.find((element) => { - const p2pixTokenValue = blockchain.verifyDepositAmmount( - element.args.amount - ); + depositsAddedList.value.find((element) => { + const p2pixTokenValue = blockchain.formatBigNumber(element.args.amount); if ( tokenValue.value!! <= Number(p2pixTokenValue) && tokenValue.value!! != 0 && @@ -68,7 +69,10 @@ const verifyLiquidity = () => { enableSelectButton.value = true; hasLiquidity.value = true; selectedDeposit.value = element; - console.log("Selected is :", blockchain.verifyDepositAmmount(element.args.amount)) + console.log( + "Selected is :", + blockchain.formatBigNumber(element.args.amount) + ); return true; } return false; diff --git a/src/components/TopBar.vue b/src/components/TopBar.vue index 5349b61..f2bcb78 100644 --- a/src/components/TopBar.vue +++ b/src/components/TopBar.vue @@ -39,7 +39,6 @@ const formatWalletBalance = (): string => { src="@/assets/logo.svg" width="75" height="75" - @load="connectMetaMask()" />
diff --git a/src/store/ether.ts b/src/store/ether.ts index 3a5b62b..4a56135 100644 --- a/src/store/ether.ts +++ b/src/store/ether.ts @@ -4,7 +4,14 @@ export const useEtherStore = defineStore("ether", { state: () => ({ walletAddress: "", balance: "", - depositList: [{}], + // Depósitos válidos para compra + depositsValidList: [{}], + // Depósitos adicionados na blockchain + depositsAddedList: [{}], + // Depósitos expirados na blockchain + depositsExpiredList: [{}], + // Locks adicionados na blockchain + locksAddedList: [{}], }), actions: { setWalletAddress(walletAddress: string) { @@ -13,8 +20,17 @@ export const useEtherStore = defineStore("ether", { setBalance(balance: string) { this.balance = balance; }, - setDepositList(depositList: any[]) { - this.depositList = depositList; + setDepositsValidList(depositsValidList: any[]) { + this.depositsValidList = depositsValidList; + }, + setDepositsAddedList(depositsAddedList: any[]) { + this.depositsAddedList = depositsAddedList; + }, + setDepositsExpiredList(depositsExpiredList: any[]) { + this.depositsExpiredList = depositsExpiredList; + }, + setLocksAddedList(locksAddedList: any[]) { + this.locksAddedList = locksAddedList; }, }, }); diff --git a/src/utils/blockchain.ts b/src/utils/blockchain.ts index a611981..246f8b6 100644 --- a/src/utils/blockchain.ts +++ b/src/utils/blockchain.ts @@ -1,14 +1,70 @@ import { useEtherStore } from "@/store/ether"; import { BigNumber, ethers } from "ethers"; -// smart contract imports +// Smart contract imports import mockToken from "./smart_contract_files/MockToken.json"; import p2pix from "./smart_contract_files/P2PIX.json"; import addresses from "./smart_contract_files/localhost.json"; -import p2pEventsAndErrors from "./smart_contract_files/EventAndErrors.json" - +// Mock wallets import import { wallets } from "./smart_contract_files/wallets.json"; +// Provider methods +const connectProvider = async () => { + const etherStore = useEtherStore(); + const window_ = window as any; + const connection = window_.ethereum; + let provider: ethers.providers.Web3Provider | null = null; + + if (!connection) return; + provider = new ethers.providers.Web3Provider(connection); + const signer = provider.getSigner(); + const tokenContract = new ethers.Contract( + addresses.token, + mockToken.abi, + signer + ); + + const walletAddress = await provider.send("eth_requestAccounts", []); + const balance = await tokenContract.balanceOf(walletAddress[0]); + + etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress[0])); + etherStore.setBalance(String(balance)); + + const p2pEvents = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + + const filterDeposits = p2pEvents.filters.DepositAdded(null); + const eventsDeposits = await p2pEvents.queryFilter(filterDeposits); + console.log("Deposits Added: ", eventsDeposits); + etherStore.setDepositsAddedList(eventsDeposits); + + const filterLocks = p2pEvents.filters.LockAdded(null); + const eventsLocks = await p2pEvents.queryFilter(filterLocks); + console.log("Locks Added: ", eventsLocks); + etherStore.setLocksAddedList(eventsLocks); + + const filterExpiredLocks = p2pEvents.filters.LockReturned(null); + const eventsExpiredLocks = await p2pEvents.queryFilter(filterExpiredLocks); + console.log("Expired Locks: ", eventsExpiredLocks); + etherStore.setDepositsExpiredList(eventsExpiredLocks); + + // (TO DO) Filter valid deposits + + connection.on("accountsChanged", (accounts: string[]) => { + updateWalletStatus(accounts[0]); + }); +}; + +const getProvider = (): ethers.providers.Web3Provider | null => { + const window_ = window as any; + const connection = window_.ethereum; + + if (!connection) return null; + + return new ethers.providers.Web3Provider(connection); +}; + +// Wallet methods +// Update wallet state (balance and address) const updateWalletStatus = async (walletAddress: string) => { const etherStore = useEtherStore(); const provider = getProvider(); @@ -23,36 +79,7 @@ const updateWalletStatus = async (walletAddress: string) => { etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress)); }; -const connectProvider = async () => { - const etherStore = useEtherStore(); - const window_ = window as any; - const connection = window_.ethereum; - let provider: ethers.providers.Web3Provider | null = null; - - if (!connection) return; - provider = new ethers.providers.Web3Provider(connection); - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); - - const walletAddress = await provider.send("eth_requestAccounts", []); - const balance = await contract.balanceOf(walletAddress[0]); - - etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress[0])); - etherStore.setBalance(String(balance)); - - const p2pContract = new ethers.Contract(addresses.p2pix, p2pEventsAndErrors.abi, signer); - - const filter = p2pContract.filters.DepositAdded(null); - const events = await p2pContract.queryFilter(filter); - - console.log(events); - etherStore.setDepositList(events); - - connection.on("accountsChanged", (accounts: string[]) => { - updateWalletStatus(accounts[0]); - }); -}; - +// Split tokens between wallets in wallets.json const splitTokens = async () => { const etherStore = useEtherStore(); const provider = getProvider(); @@ -71,13 +98,14 @@ const splitTokens = async () => { } }; -const mockDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => { +// Deposit methods +// Gets value and pix key from user's form to create a deposit in the blockchain +const addDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => { const etherStore = useEtherStore(); const provider = getProvider(); + if (!provider) return; - const signer = provider.getSigner(); - const tokenContract = new ethers.Contract( addresses.token, mockToken.abi, @@ -85,14 +113,14 @@ const mockDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => { ); const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); - // first get the approval + // First get the approval const apprv = await tokenContract.approve( addresses.p2pix, ethers.utils.parseEther(tokenQty) ); await apprv.wait(); - // deposit + // Now we make the deposit const deposit = await p2pContract.deposit( addresses.token, ethers.utils.parseEther(tokenQty), @@ -102,65 +130,91 @@ const mockDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => { updateWalletStatus(etherStore.walletAddress); - const p2pEvents = new ethers.Contract(addresses.p2pix, p2pEventsAndErrors.abi, signer); - + const p2pEvents = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); const filter = p2pEvents.filters.DepositAdded(null); const events = await p2pEvents.queryFilter(filter); - console.log(events); - - etherStore.setDepositList(events); -}; - -const countDeposit = async () => { - const provider = getProvider(); - if (!provider) return; - - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); - - const count = await contract.depositCount(); - - console.log(Number(count)); + etherStore.setDepositsAddedList(events); }; +// Get specific deposit data by its ID const mapDeposits = async (depositId: BigNumber) => { const provider = getProvider(); + if (!provider) return; const signer = provider.getSigner(); const contract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); - - const deposit = await contract.mapDeposits(depositId); + const deposit = await contract.mapDeposits(depositId.toNumber()); console.log(deposit); return deposit; }; +// Lock methods +// Gets value from user's form to create a lock in the blockchain +const addLock = async (depositId: Number, amount: Number) => { + const etherStore = useEtherStore(); + const provider = getProvider(); + + if (!provider) return; + const signer = provider.getSigner(); + const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + + // Make lock + await p2pContract.lock( + depositId, + etherStore.walletAddress, + ethers.constants.AddressZero, + 0, + ethers.utils.parseEther(amount.toString()), + [] + ); + + const filterLocks = p2pContract.filters.LockAdded(null); + const eventsLocks = await p2pContract.queryFilter(filterLocks); + etherStore.setLocksAddedList(eventsLocks); +}; + +// Get specific lock data by its ID +const mapLocks = async (lockId: string) => { + const provider = getProvider(); + + if (!provider) return; + + const signer = provider.getSigner(); + const contract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + const lock = await contract.mapLocks(lockId); + + console.log(lock); + return lock; +}; + +// Releases lock by specific ID and other additional data +// (TO DO) +const releaseLock = async () => { + return; +}; + +// Formatting methods const formatEther = (balance: string) => { const formatted = ethers.utils.formatEther(balance); return formatted; }; -const verifyDepositAmmount = (ammountBigNumber: BigNumber): string => { - return ethers.utils.formatEther(ammountBigNumber); -}; - -const getProvider = (): ethers.providers.Web3Provider | null => { - const window_ = window as any; - const connection = window_.ethereum; - - if (!connection) return null; - - return new ethers.providers.Web3Provider(connection); +const formatBigNumber = (num: BigNumber) => { + const formattedNum = ethers.utils.formatEther(num); + return formattedNum; }; export default { connectProvider, formatEther, splitTokens, - mockDeposit, - countDeposit, + addDeposit, mapDeposits, - verifyDepositAmmount, + formatBigNumber, + addLock, + mapLocks, + releaseLock, }; diff --git a/src/utils/smart_contract_files/EventAndErrors.json b/src/utils/smart_contract_files/EventAndErrors.json deleted file mode 100644 index 1cfa90a..0000000 --- a/src/utils/smart_contract_files/EventAndErrors.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "EventAndErrors", - "sourceName": "contracts/EventAndErrors.sol", - "abi": [ - { - "inputs": [], - "name": "AlreadyReleased", - "type": "error" - }, - { - "inputs": [], - "name": "DepositAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidDeposit", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidSigner", - "type": "error" - }, - { - "inputs": [], - "name": "LoopOverflow", - "type": "error" - }, - { - "inputs": [], - "name": "NotEnoughTokens", - "type": "error" - }, - { - "inputs": [], - "name": "NotExpired", - "type": "error" - }, - { - "inputs": [], - "name": "OnlySeller", - "type": "error" - }, - { - "inputs": [], - "name": "TxAlreadyUsed", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "seller", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "DepositAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "seller", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositID", - "type": "uint256" - } - ], - "name": "DepositClosed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "seller", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "DepositWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "FundsWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "buyer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "lockID", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "LockAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "buyer", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lockId", - "type": "bytes32" - } - ], - "name": "LockReleased", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "buyer", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lockId", - "type": "bytes32" - } - ], - "name": "LockReturned", - "type": "event" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/src/utils/smart_contract_files/P2PIX.json b/src/utils/smart_contract_files/P2PIX.json index 04d915b..34e712f 100644 --- a/src/utils/smart_contract_files/P2PIX.json +++ b/src/utils/smart_contract_files/P2PIX.json @@ -90,12 +90,6 @@ "name": "token", "type": "address" }, - { - "indexed": false, - "internalType": "uint256", - "name": "premium", - "type": "uint256" - }, { "indexed": false, "internalType": "uint256", @@ -150,6 +144,25 @@ "name": "DepositWithdrawn", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "FundsWithdrawn", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -238,25 +251,6 @@ "name": "OwnerUpdated", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "PremiumsWithdrawn", - "type": "event" - }, { "inputs": [ { @@ -306,17 +300,17 @@ "inputs": [ { "internalType": "address", - "name": "token", + "name": "_token", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" }, { "internalType": "string", - "name": "pixTarget", + "name": "_pixTarget", "type": "string" } ], @@ -328,7 +322,7 @@ "type": "uint256" } ], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { @@ -403,11 +397,6 @@ "name": "remaining", "type": "uint256" }, - { - "internalType": "uint256", - "name": "premium", - "type": "uint256" - }, { "internalType": "string", "name": "pixTarget", @@ -587,14 +576,18 @@ }, { "inputs": [], - "name": "withdrawPremiums", + "name": "withdrawBalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" } ], - "bytecode": "0x60806040526001805560405162001806380380620018068339810160408190526200002a9162000123565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350600382905580516000905b80821015620000d6576000620000ae8484815181106200009a576200009a62000203565b6020026020010151620000e060201b60201c565b6000908152600460205260409020805460ff1916600190811790915592909201915062000076565b5050505062000219565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200011e57600080fd5b919050565b600080604083850312156200013757600080fd5b8251602080850151919350906001600160401b03808211156200015957600080fd5b818601915086601f8301126200016e57600080fd5b815181811115620001835762000183620000f0565b8060051b604051601f19603f83011681018181108582111715620001ab57620001ab620000f0565b604052918252848201925083810185019189831115620001ca57600080fd5b938501935b82851015620001f357620001e38562000106565b84529385019392850192620001cf565b8096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6115dd80620002296000396000f3fe6080604052600436106100e85760003560e01c80636193cdfb1161008a5780638e2a3d36116100595780638e2a3d36146102f55780639872dbfe1461032757806398a268711461033d578063bfe07da61461037d57600080fd5b80636193cdfb1461026857806372fada5c1461027d5780638da5cb5b1461029d5780638e2749d6146102d557600080fd5b80632dfdf0b5116100c65780632dfdf0b5146101d857806336317972146101ef5780634b2ae9801461020f5780634e1389ed1461024857600080fd5b806303aaf306146100ed57806313af40351461012057806316d7224014610142575b600080fd5b3480156100f957600080fd5b5061010d6101083660046111e7565b610390565b6040519081526020015b60405180910390f35b34801561012c57600080fd5b5061014061013b366004611269565b61053a565b005b34801561014e57600080fd5b5061019f61015d366004611284565b60066020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160a01b03918216911686565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c001610117565b3480156101e457600080fd5b5060025461010d9081565b3480156101fb57600080fd5b5061014061020a36600461129d565b6105e0565b34801561021b57600080fd5b5061010d61022a366004611269565b600c1b750ffffffffffffffffffffffffffffffffffffffff0001690565b34801561025457600080fd5b506101406102633660046112e9565b6106a0565b34801561027457600080fd5b50610140610962565b34801561028957600080fd5b50610140610298366004611284565b6109f2565b3480156102a957600080fd5b506000546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b3480156102e157600080fd5b506101406102f036600461133c565b610a7a565b34801561030157600080fd5b50610315610310366004611284565b610b76565b6040516101179695949392919061137e565b34801561033357600080fd5b5061010d60035481565b34801561034957600080fd5b5061036d610358366004611284565b60046020526000908152604090205460ff1681565b6040519015158152602001610117565b61010d61038b36600461140c565b610c46565b600061039a610e00565b6103a48383610a7a565b60008881526005602052604090206004810154600160a01b900460ff166103de57604051635972996f60e11b815260040160405180910390fd5b8054851115610400576040516308aeed0f60e21b815260040160405180910390fd5b61040b89868a610e2b565b915060006040518060c001604052808b81526020018881526020018781526020016003544361043a91906114a9565b81526001600160a01b03808c166020808401919091528b82166040938401526000878152600682528381208551815591850151600183015592840151600282015560608401516003820155608084015160048201805491841673ffffffffffffffffffffffffffffffffffffffff1992831617905560a085015160059092018054929093169116179055835491925087918491906104d99084906114c1565b9091555050604080518b81526020810188905284916001600160a01b038c16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505061052f60018055565b979650505050505050565b6000546001600160a01b031633146105885760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6105e8610e00565b6105f183610eaf565b6105fb8282610a7a565b60008381526005602052604090206004810154600160a01b900460ff1615156001141561062b5761062b846109f2565b600481015481546000835560038301546001600160a01b03928316926106549184911683610eec565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a250505061069b60018055565b505050565b6106a8610e00565b6000858152600660205260409020600381015443108015906106cc57506002810154155b156106ea576040516331da482760e11b815260040160405180910390fd5b80546000908152600560209081526040808320600280860154925191949361071893918601928b9101611513565b60405160208183030381529060405280519060200120905060008160405160200161076f91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600790935291205490915060ff161515600114156107bd57604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff881692820192909252606081018990526080810188905261083f9060019060a0016020604051602081039080840390855afa158015610815573d6000803e3d6000fd5b5050604051601f190151600c1b750ffffffffffffffffffffffffffffffffffffffff00016919050565b60008181526004602052604090205490915060ff1661087157604051632057875960e21b815260040160405180910390fd5b6004840154600186015460028701546001600160a01b0390921691600091610898916114c1565b60006002890181905560038901819055868152600760205260409020805460ff1916600117905560048801549091506108dc9083906001600160a01b031683610eec565b60018701541561090757600587015460018801546109079184916001600160a01b0390911690610eec565b60048701546040518d81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a25050505050505061095b60018055565b5050505050565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161057f565b476109b63382610f78565b60408051338152602081018390527fbf0d92faf65e256806eefa1a0d281d4873cc3c80d1ed25b8ae6f7cc66fc918ef910160405180910390a150565b6109fb81610eaf565b6000818152600560209081526040918290206004810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556003015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6000815b80821015610b5a57600060066000868686818110610a9e57610a9e6115ba565b9050602002013581526020019081526020016000209050610abe81610fd3565b6002810154815460009081526005602052604081208054909190610ae39084906114a9565b90915550506000600282015560048101546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff868686818110610b3057610b306115ba565b90506020020135604051610b4691815260200190565b60405180910390a282600101925050610a7e565b80821015610b705763dfb035c96000526004601cfd5b50505050565b60056020526000908152604090208054600182015460028301805492939192610b9e906114d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906114d8565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b50505050600383015460049093015491926001600160a01b03908116929081169150600160a01b900460ff1686565b6000610c50611006565b9050600085905060006040518060c0016040528087815260200134815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038916604082015260016060909101529050610cd0610e00565b60008381526005602090815260409182902083518155818401516001820155918301518051849392610d099260028501929101906110e6565b50606082015160038201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392831617905560808301516004909201805460a090940151929091167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055600280546001019055610d9c82333089611056565b610da560018055565b604080518481526001600160a01b0389166020820152348183015260608101889052905133917fe0cfbec12278e314697ee34bb7a1ba4d704e84c438680672f7c1175f287e5910919081900360800190a25050949350505050565b60015460021415610e245760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff19169082015260009060740160405160208183030381529060405280519060200120905043600660008381526020019081526020016000206003015410610ea85760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6000818152600560205260409020600301546001600160a01b03163314610ee9576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080610b705760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c45440000000000000000000000000000000000604482015260640161057f565b600080600080600085875af190508061069b5760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c454400000000000000000000000000604482015260640161057f565b438160030154101580610fe857506002810154155b15610ee95760405163d0404f8560e01b815260040160405180910390fd5b600061101160025490565b600081815260056020526040902060040154909150600160a01b900460ff161515600114156110535760405163c44bd76560e01b815260040160405180910390fd5b90565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d116001600051141617169150600060605280604052508061095b5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640161057f565b8280546110f2906114d8565b90600052602060002090601f016020900481019282611114576000855561115a565b82601f1061112d57805160ff191683800117855561115a565b8280016001018555821561115a579182015b8281111561115a57825182559160200191906001019061113f565b5061116692915061116a565b5090565b5b80821115611166576000815560010161116b565b80356001600160a01b038116811461119657600080fd5b919050565b60008083601f8401126111ad57600080fd5b50813567ffffffffffffffff8111156111c557600080fd5b6020830191508360208260051b85010111156111e057600080fd5b9250929050565b600080600080600080600060c0888a03121561120257600080fd5b873596506112126020890161117f565b95506112206040890161117f565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561124a57600080fd5b6112568a828b0161119b565b989b979a50959850939692959293505050565b60006020828403121561127b57600080fd5b610ea88261117f565b60006020828403121561129657600080fd5b5035919050565b6000806000604084860312156112b257600080fd5b83359250602084013567ffffffffffffffff8111156112d057600080fd5b6112dc8682870161119b565b9497909650939450505050565b600080600080600060a0868803121561130157600080fd5b85359450602086013593506040860135925060608601359150608086013560ff8116811461132e57600080fd5b809150509295509295909350565b6000806020838503121561134f57600080fd5b823567ffffffffffffffff81111561136657600080fd5b6113728582860161119b565b90969095509350505050565b86815260006020878184015260c0604084015286518060c085015260005b818110156113b85788810183015185820160e00152820161139c565b818111156113ca57600060e083870101525b50601f01601f1916830160e00191506113f0905060608301866001600160a01b03169052565b6001600160a01b038416608083015282151560a083015261052f565b6000806000806060858703121561142257600080fd5b61142b8561117f565b935060208501359250604085013567ffffffffffffffff8082111561144f57600080fd5b818701915087601f83011261146357600080fd5b81358181111561147257600080fd5b88602082850101111561148457600080fd5b95989497505060200194505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114bc576114bc611493565b500190565b6000828210156114d3576114d3611493565b500390565b600181811c908216806114ec57607f821691505b6020821081141561150d57634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061152f57607f831692505b602080841082141561154f57634e487b7160e01b86526022600452602486fd5b8180156115635760018114611574576115a1565b60ff198616895284890196506115a1565b60008c81526020902060005b868110156115995781548b820152908501908301611580565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000809000a", - "deployedBytecode": "0x6080604052600436106100e85760003560e01c80636193cdfb1161008a5780638e2a3d36116100595780638e2a3d36146102f55780639872dbfe1461032757806398a268711461033d578063bfe07da61461037d57600080fd5b80636193cdfb1461026857806372fada5c1461027d5780638da5cb5b1461029d5780638e2749d6146102d557600080fd5b80632dfdf0b5116100c65780632dfdf0b5146101d857806336317972146101ef5780634b2ae9801461020f5780634e1389ed1461024857600080fd5b806303aaf306146100ed57806313af40351461012057806316d7224014610142575b600080fd5b3480156100f957600080fd5b5061010d6101083660046111e7565b610390565b6040519081526020015b60405180910390f35b34801561012c57600080fd5b5061014061013b366004611269565b61053a565b005b34801561014e57600080fd5b5061019f61015d366004611284565b60066020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160a01b03918216911686565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c001610117565b3480156101e457600080fd5b5060025461010d9081565b3480156101fb57600080fd5b5061014061020a36600461129d565b6105e0565b34801561021b57600080fd5b5061010d61022a366004611269565b600c1b750ffffffffffffffffffffffffffffffffffffffff0001690565b34801561025457600080fd5b506101406102633660046112e9565b6106a0565b34801561027457600080fd5b50610140610962565b34801561028957600080fd5b50610140610298366004611284565b6109f2565b3480156102a957600080fd5b506000546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b3480156102e157600080fd5b506101406102f036600461133c565b610a7a565b34801561030157600080fd5b50610315610310366004611284565b610b76565b6040516101179695949392919061137e565b34801561033357600080fd5b5061010d60035481565b34801561034957600080fd5b5061036d610358366004611284565b60046020526000908152604090205460ff1681565b6040519015158152602001610117565b61010d61038b36600461140c565b610c46565b600061039a610e00565b6103a48383610a7a565b60008881526005602052604090206004810154600160a01b900460ff166103de57604051635972996f60e11b815260040160405180910390fd5b8054851115610400576040516308aeed0f60e21b815260040160405180910390fd5b61040b89868a610e2b565b915060006040518060c001604052808b81526020018881526020018781526020016003544361043a91906114a9565b81526001600160a01b03808c166020808401919091528b82166040938401526000878152600682528381208551815591850151600183015592840151600282015560608401516003820155608084015160048201805491841673ffffffffffffffffffffffffffffffffffffffff1992831617905560a085015160059092018054929093169116179055835491925087918491906104d99084906114c1565b9091555050604080518b81526020810188905284916001600160a01b038c16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505061052f60018055565b979650505050505050565b6000546001600160a01b031633146105885760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6105e8610e00565b6105f183610eaf565b6105fb8282610a7a565b60008381526005602052604090206004810154600160a01b900460ff1615156001141561062b5761062b846109f2565b600481015481546000835560038301546001600160a01b03928316926106549184911683610eec565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a250505061069b60018055565b505050565b6106a8610e00565b6000858152600660205260409020600381015443108015906106cc57506002810154155b156106ea576040516331da482760e11b815260040160405180910390fd5b80546000908152600560209081526040808320600280860154925191949361071893918601928b9101611513565b60405160208183030381529060405280519060200120905060008160405160200161076f91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600790935291205490915060ff161515600114156107bd57604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff881692820192909252606081018990526080810188905261083f9060019060a0016020604051602081039080840390855afa158015610815573d6000803e3d6000fd5b5050604051601f190151600c1b750ffffffffffffffffffffffffffffffffffffffff00016919050565b60008181526004602052604090205490915060ff1661087157604051632057875960e21b815260040160405180910390fd5b6004840154600186015460028701546001600160a01b0390921691600091610898916114c1565b60006002890181905560038901819055868152600760205260409020805460ff1916600117905560048801549091506108dc9083906001600160a01b031683610eec565b60018701541561090757600587015460018801546109079184916001600160a01b0390911690610eec565b60048701546040518d81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a25050505050505061095b60018055565b5050505050565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161057f565b476109b63382610f78565b60408051338152602081018390527fbf0d92faf65e256806eefa1a0d281d4873cc3c80d1ed25b8ae6f7cc66fc918ef910160405180910390a150565b6109fb81610eaf565b6000818152600560209081526040918290206004810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556003015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6000815b80821015610b5a57600060066000868686818110610a9e57610a9e6115ba565b9050602002013581526020019081526020016000209050610abe81610fd3565b6002810154815460009081526005602052604081208054909190610ae39084906114a9565b90915550506000600282015560048101546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff868686818110610b3057610b306115ba565b90506020020135604051610b4691815260200190565b60405180910390a282600101925050610a7e565b80821015610b705763dfb035c96000526004601cfd5b50505050565b60056020526000908152604090208054600182015460028301805492939192610b9e906114d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906114d8565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b50505050600383015460049093015491926001600160a01b03908116929081169150600160a01b900460ff1686565b6000610c50611006565b9050600085905060006040518060c0016040528087815260200134815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038916604082015260016060909101529050610cd0610e00565b60008381526005602090815260409182902083518155818401516001820155918301518051849392610d099260028501929101906110e6565b50606082015160038201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392831617905560808301516004909201805460a090940151929091167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055600280546001019055610d9c82333089611056565b610da560018055565b604080518481526001600160a01b0389166020820152348183015260608101889052905133917fe0cfbec12278e314697ee34bb7a1ba4d704e84c438680672f7c1175f287e5910919081900360800190a25050949350505050565b60015460021415610e245760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff19169082015260009060740160405160208183030381529060405280519060200120905043600660008381526020019081526020016000206003015410610ea85760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6000818152600560205260409020600301546001600160a01b03163314610ee9576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080610b705760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c45440000000000000000000000000000000000604482015260640161057f565b600080600080600085875af190508061069b5760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c454400000000000000000000000000604482015260640161057f565b438160030154101580610fe857506002810154155b15610ee95760405163d0404f8560e01b815260040160405180910390fd5b600061101160025490565b600081815260056020526040902060040154909150600160a01b900460ff161515600114156110535760405163c44bd76560e01b815260040160405180910390fd5b90565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d116001600051141617169150600060605280604052508061095b5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640161057f565b8280546110f2906114d8565b90600052602060002090601f016020900481019282611114576000855561115a565b82601f1061112d57805160ff191683800117855561115a565b8280016001018555821561115a579182015b8281111561115a57825182559160200191906001019061113f565b5061116692915061116a565b5090565b5b80821115611166576000815560010161116b565b80356001600160a01b038116811461119657600080fd5b919050565b60008083601f8401126111ad57600080fd5b50813567ffffffffffffffff8111156111c557600080fd5b6020830191508360208260051b85010111156111e057600080fd5b9250929050565b600080600080600080600060c0888a03121561120257600080fd5b873596506112126020890161117f565b95506112206040890161117f565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561124a57600080fd5b6112568a828b0161119b565b989b979a50959850939692959293505050565b60006020828403121561127b57600080fd5b610ea88261117f565b60006020828403121561129657600080fd5b5035919050565b6000806000604084860312156112b257600080fd5b83359250602084013567ffffffffffffffff8111156112d057600080fd5b6112dc8682870161119b565b9497909650939450505050565b600080600080600060a0868803121561130157600080fd5b85359450602086013593506040860135925060608601359150608086013560ff8116811461132e57600080fd5b809150509295509295909350565b6000806020838503121561134f57600080fd5b823567ffffffffffffffff81111561136657600080fd5b6113728582860161119b565b90969095509350505050565b86815260006020878184015260c0604084015286518060c085015260005b818110156113b85788810183015185820160e00152820161139c565b818111156113ca57600060e083870101525b50601f01601f1916830160e00191506113f0905060608301866001600160a01b03169052565b6001600160a01b038416608083015282151560a083015261052f565b6000806000806060858703121561142257600080fd5b61142b8561117f565b935060208501359250604085013567ffffffffffffffff8082111561144f57600080fd5b818701915087601f83011261146357600080fd5b81358181111561147257600080fd5b88602082850101111561148457600080fd5b95989497505060200194505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114bc576114bc611493565b500190565b6000828210156114d3576114d3611493565b500390565b600181811c908216806114ec57607f821691505b6020821081141561150d57634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061152f57607f831692505b602080841082141561154f57634e487b7160e01b86526022600452602486fd5b8180156115635760018114611574576115a1565b60ff198616895284890196506115a1565b60008c81526020902060005b868110156115995781548b820152908501908301611580565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000809000a", + "bytecode": "0x60806040526001805560405162001807380380620018078339810160408190526200002a9162000123565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350600382905580516000905b80821015620000d6576000620000ae8484815181106200009a576200009a62000203565b6020026020010151620000e060201b60201c565b6000908152600460205260409020805460ff1916600190811790915592909201915062000076565b5050505062000219565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200011e57600080fd5b919050565b600080604083850312156200013757600080fd5b8251602080850151919350906001600160401b03808211156200015957600080fd5b818601915086601f8301126200016e57600080fd5b815181811115620001835762000183620000f0565b8060051b604051601f19603f83011681018181108582111715620001ab57620001ab620000f0565b604052918252848201925083810185019189831115620001ca57600080fd5b938501935b82851015620001f357620001e38562000106565b84529385019392850192620001cf565b8096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6115de80620002296000396000f3fe6080604052600436106100ec5760003560e01c80635fd8c7101161008a5780638e2a3d36116100595780638e2a3d36146103005780639872dbfe1461033157806398a2687114610347578063bfe07da61461038757600080fd5b80635fd8c7101461027357806372fada5c146102885780638da5cb5b146102a85780638e2749d6146102e057600080fd5b80632dfdf0b5116100c65780632dfdf0b5146101e357806336317972146101fa5780634b2ae9801461021a5780634e1389ed1461025357600080fd5b806303aaf306146100f857806313af40351461012b57806316d722401461014d57600080fd5b366100f357005b600080fd5b34801561010457600080fd5b506101186101133660046111e9565b6103a7565b6040519081526020015b60405180910390f35b34801561013757600080fd5b5061014b61014636600461126b565b610551565b005b34801561015957600080fd5b506101aa610168366004611286565b60066020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160a01b03918216911686565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c001610122565b3480156101ef57600080fd5b506002546101189081565b34801561020657600080fd5b5061014b61021536600461129f565b6105f7565b34801561022657600080fd5b5061011861023536600461126b565b600c1b750ffffffffffffffffffffffffffffffffffffffff0001690565b34801561025f57600080fd5b5061014b61026e3660046112eb565b6106b7565b34801561027f57600080fd5b5061014b61097a565b34801561029457600080fd5b5061014b6102a3366004611286565b610a0a565b3480156102b457600080fd5b506000546102c8906001600160a01b031681565b6040516001600160a01b039091168152602001610122565b3480156102ec57600080fd5b5061014b6102fb36600461133e565b610a92565b34801561030c57600080fd5b5061032061031b366004611286565b610b8e565b604051610122959493929190611380565b34801561033d57600080fd5b5061011860035481565b34801561035357600080fd5b50610377610362366004611286565b60046020526000908152604090205460ff1681565b6040519015158152602001610122565b34801561039357600080fd5b506101186103a236600461140d565b610c58565b60006103b1610e02565b6103bb8383610a92565b60008881526005602052604090206003810154600160a01b900460ff166103f557604051635972996f60e11b815260040160405180910390fd5b8054851115610417576040516308aeed0f60e21b815260040160405180910390fd5b61042289868a610e2d565b915060006040518060c001604052808b81526020018881526020018781526020016003544361045191906114aa565b81526001600160a01b03808c166020808401919091528b82166040938401526000878152600682528381208551815591850151600183015592840151600282015560608401516003820155608084015160048201805491841673ffffffffffffffffffffffffffffffffffffffff1992831617905560a085015160059092018054929093169116179055835491925087918491906104f09084906114c2565b9091555050604080518b81526020810188905284916001600160a01b038c16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505061054660018055565b979650505050505050565b6000546001600160a01b0316331461059f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6105ff610e02565b61060883610eb1565b6106128282610a92565b60008381526005602052604090206003810154600160a01b900460ff161515600114156106425761064284610a0a565b600381015481546000835560028301546001600160a01b039283169261066b9184911683610eee565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506106b260018055565b505050565b6106bf610e02565b60008581526006602052604090206003810154431015806106e257506002810154155b15610700576040516331da482760e11b815260040160405180910390fd5b805460009081526005602090815260408083206002850154915190939261073092600186019290918b9101611514565b60405160208183030381529060405280519060200120905060008160405160200161078791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600790935291205490915060ff161515600114156107d557604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff88169282019290925260608101899052608081018890526108579060019060a0016020604051602081039080840390855afa15801561082d573d6000803e3d6000fd5b5050604051601f190151600c1b750ffffffffffffffffffffffffffffffffffffffff00016919050565b60008181526004602052604090205490915060ff1661088957604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b03909216916000916108b0916114c2565b60006002890181905560038901819055868152600760205260409020805460ff1916600117905560048801549091506108f49083906001600160a01b031683610eee565b60018701541561091f576005870154600188015461091f9184916001600160a01b0390911690610eee565b60048701546040518d81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a25050505050505061097360018055565b5050505050565b6000546001600160a01b031633146109c35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610596565b476109ce3382610f7a565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910160405180910390a150565b610a1381610eb1565b6000818152600560209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6000815b80821015610b7257600060066000868686818110610ab657610ab66115bb565b9050602002013581526020019081526020016000209050610ad681610fd5565b6002810154815460009081526005602052604081208054909190610afb9084906114aa565b90915550506000600282015560048101546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff868686818110610b4857610b486115bb565b90506020020135604051610b5e91815260200190565b60405180910390a282600101925050610a96565b80821015610b885763dfb035c96000526004601cfd5b50505050565b60056020526000908152604090208054600182018054919291610bb0906114d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc906114d9565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000610c62611008565b9050600085905060006040518060a0016040528087815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038916604082015260016060909101529050610cdc610e02565b6000838152600560209081526040909120825181558183015180518493610d0a9260018501929101906110e8565b506040820151600280830180546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199091161790556060840151600390930180546080909501511515600160a01b027fffffffffffffffffffffff000000000000000000000000000000000000000000909516939092169290921792909217909155610d989080546001019055565b610da482333089611058565b610dad60018055565b604080518481526001600160a01b038916602082015290810187905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a25050949350505050565b60015460021415610e265760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff19169082015260009060740160405160208183030381529060405280519060200120905043600660008381526020019081526020016000206003015410610eaa5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6000818152600560205260409020600201546001600160a01b03163314610eeb576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080610b885760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610596565b600080600080600085875af19050806106b25760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610596565b438160030154101580610fea57506002810154155b15610eeb5760405163d0404f8560e01b815260040160405180910390fd5b600061101360025490565b600081815260056020526040902060030154909150600160a01b900460ff161515600114156110555760405163c44bd76560e01b815260040160405180910390fd5b90565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806109735760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610596565b8280546110f4906114d9565b90600052602060002090601f016020900481019282611116576000855561115c565b82601f1061112f57805160ff191683800117855561115c565b8280016001018555821561115c579182015b8281111561115c578251825591602001919060010190611141565b5061116892915061116c565b5090565b5b80821115611168576000815560010161116d565b80356001600160a01b038116811461119857600080fd5b919050565b60008083601f8401126111af57600080fd5b50813567ffffffffffffffff8111156111c757600080fd5b6020830191508360208260051b85010111156111e257600080fd5b9250929050565b600080600080600080600060c0888a03121561120457600080fd5b8735965061121460208901611181565b955061122260408901611181565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561124c57600080fd5b6112588a828b0161119d565b989b979a50959850939692959293505050565b60006020828403121561127d57600080fd5b610eaa82611181565b60006020828403121561129857600080fd5b5035919050565b6000806000604084860312156112b457600080fd5b83359250602084013567ffffffffffffffff8111156112d257600080fd5b6112de8682870161119d565b9497909650939450505050565b600080600080600060a0868803121561130357600080fd5b85359450602086013593506040860135925060608601359150608086013560ff8116811461133057600080fd5b809150509295509295909350565b6000806020838503121561135157600080fd5b823567ffffffffffffffff81111561136857600080fd5b6113748582860161119d565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b818110156113b45788810183015185820160c001528201611398565b818111156113c657600060c083870101525b50601f01601f1916830160c00191506113ec905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b6000806000806060858703121561142357600080fd5b61142c85611181565b935060208501359250604085013567ffffffffffffffff8082111561145057600080fd5b818701915087601f83011261146457600080fd5b81358181111561147357600080fd5b88602082850101111561148557600080fd5b95989497505060200194505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114bd576114bd611494565b500190565b6000828210156114d4576114d4611494565b500390565b600181811c908216806114ed57607f821691505b6020821081141561150e57634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061153057607f831692505b602080841082141561155057634e487b7160e01b86526022600452602486fd5b8180156115645760018114611575576115a2565b60ff198616895284890196506115a2565b60008c81526020902060005b8681101561159a5781548b820152908501908301611581565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000809000a", + "deployedBytecode": "0x6080604052600436106100ec5760003560e01c80635fd8c7101161008a5780638e2a3d36116100595780638e2a3d36146103005780639872dbfe1461033157806398a2687114610347578063bfe07da61461038757600080fd5b80635fd8c7101461027357806372fada5c146102885780638da5cb5b146102a85780638e2749d6146102e057600080fd5b80632dfdf0b5116100c65780632dfdf0b5146101e357806336317972146101fa5780634b2ae9801461021a5780634e1389ed1461025357600080fd5b806303aaf306146100f857806313af40351461012b57806316d722401461014d57600080fd5b366100f357005b600080fd5b34801561010457600080fd5b506101186101133660046111e9565b6103a7565b6040519081526020015b60405180910390f35b34801561013757600080fd5b5061014b61014636600461126b565b610551565b005b34801561015957600080fd5b506101aa610168366004611286565b60066020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160a01b03918216911686565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c001610122565b3480156101ef57600080fd5b506002546101189081565b34801561020657600080fd5b5061014b61021536600461129f565b6105f7565b34801561022657600080fd5b5061011861023536600461126b565b600c1b750ffffffffffffffffffffffffffffffffffffffff0001690565b34801561025f57600080fd5b5061014b61026e3660046112eb565b6106b7565b34801561027f57600080fd5b5061014b61097a565b34801561029457600080fd5b5061014b6102a3366004611286565b610a0a565b3480156102b457600080fd5b506000546102c8906001600160a01b031681565b6040516001600160a01b039091168152602001610122565b3480156102ec57600080fd5b5061014b6102fb36600461133e565b610a92565b34801561030c57600080fd5b5061032061031b366004611286565b610b8e565b604051610122959493929190611380565b34801561033d57600080fd5b5061011860035481565b34801561035357600080fd5b50610377610362366004611286565b60046020526000908152604090205460ff1681565b6040519015158152602001610122565b34801561039357600080fd5b506101186103a236600461140d565b610c58565b60006103b1610e02565b6103bb8383610a92565b60008881526005602052604090206003810154600160a01b900460ff166103f557604051635972996f60e11b815260040160405180910390fd5b8054851115610417576040516308aeed0f60e21b815260040160405180910390fd5b61042289868a610e2d565b915060006040518060c001604052808b81526020018881526020018781526020016003544361045191906114aa565b81526001600160a01b03808c166020808401919091528b82166040938401526000878152600682528381208551815591850151600183015592840151600282015560608401516003820155608084015160048201805491841673ffffffffffffffffffffffffffffffffffffffff1992831617905560a085015160059092018054929093169116179055835491925087918491906104f09084906114c2565b9091555050604080518b81526020810188905284916001600160a01b038c16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505061054660018055565b979650505050505050565b6000546001600160a01b0316331461059f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6105ff610e02565b61060883610eb1565b6106128282610a92565b60008381526005602052604090206003810154600160a01b900460ff161515600114156106425761064284610a0a565b600381015481546000835560028301546001600160a01b039283169261066b9184911683610eee565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506106b260018055565b505050565b6106bf610e02565b60008581526006602052604090206003810154431015806106e257506002810154155b15610700576040516331da482760e11b815260040160405180910390fd5b805460009081526005602090815260408083206002850154915190939261073092600186019290918b9101611514565b60405160208183030381529060405280519060200120905060008160405160200161078791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600790935291205490915060ff161515600114156107d557604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff88169282019290925260608101899052608081018890526108579060019060a0016020604051602081039080840390855afa15801561082d573d6000803e3d6000fd5b5050604051601f190151600c1b750ffffffffffffffffffffffffffffffffffffffff00016919050565b60008181526004602052604090205490915060ff1661088957604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b03909216916000916108b0916114c2565b60006002890181905560038901819055868152600760205260409020805460ff1916600117905560048801549091506108f49083906001600160a01b031683610eee565b60018701541561091f576005870154600188015461091f9184916001600160a01b0390911690610eee565b60048701546040518d81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a25050505050505061097360018055565b5050505050565b6000546001600160a01b031633146109c35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610596565b476109ce3382610f7a565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910160405180910390a150565b610a1381610eb1565b6000818152600560209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6000815b80821015610b7257600060066000868686818110610ab657610ab66115bb565b9050602002013581526020019081526020016000209050610ad681610fd5565b6002810154815460009081526005602052604081208054909190610afb9084906114aa565b90915550506000600282015560048101546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff868686818110610b4857610b486115bb565b90506020020135604051610b5e91815260200190565b60405180910390a282600101925050610a96565b80821015610b885763dfb035c96000526004601cfd5b50505050565b60056020526000908152604090208054600182018054919291610bb0906114d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc906114d9565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000610c62611008565b9050600085905060006040518060a0016040528087815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038916604082015260016060909101529050610cdc610e02565b6000838152600560209081526040909120825181558183015180518493610d0a9260018501929101906110e8565b506040820151600280830180546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199091161790556060840151600390930180546080909501511515600160a01b027fffffffffffffffffffffff000000000000000000000000000000000000000000909516939092169290921792909217909155610d989080546001019055565b610da482333089611058565b610dad60018055565b604080518481526001600160a01b038916602082015290810187905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a25050949350505050565b60015460021415610e265760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff19169082015260009060740160405160208183030381529060405280519060200120905043600660008381526020019081526020016000206003015410610eaa5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6000818152600560205260409020600201546001600160a01b03163314610eeb576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080610b885760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610596565b600080600080600085875af19050806106b25760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610596565b438160030154101580610fea57506002810154155b15610eeb5760405163d0404f8560e01b815260040160405180910390fd5b600061101360025490565b600081815260056020526040902060030154909150600160a01b900460ff161515600114156110555760405163c44bd76560e01b815260040160405180910390fd5b90565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806109735760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610596565b8280546110f4906114d9565b90600052602060002090601f016020900481019282611116576000855561115c565b82601f1061112f57805160ff191683800117855561115c565b8280016001018555821561115c579182015b8281111561115c578251825591602001919060010190611141565b5061116892915061116c565b5090565b5b80821115611168576000815560010161116d565b80356001600160a01b038116811461119857600080fd5b919050565b60008083601f8401126111af57600080fd5b50813567ffffffffffffffff8111156111c757600080fd5b6020830191508360208260051b85010111156111e257600080fd5b9250929050565b600080600080600080600060c0888a03121561120457600080fd5b8735965061121460208901611181565b955061122260408901611181565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561124c57600080fd5b6112588a828b0161119d565b989b979a50959850939692959293505050565b60006020828403121561127d57600080fd5b610eaa82611181565b60006020828403121561129857600080fd5b5035919050565b6000806000604084860312156112b457600080fd5b83359250602084013567ffffffffffffffff8111156112d257600080fd5b6112de8682870161119d565b9497909650939450505050565b600080600080600060a0868803121561130357600080fd5b85359450602086013593506040860135925060608601359150608086013560ff8116811461133057600080fd5b809150509295509295909350565b6000806020838503121561135157600080fd5b823567ffffffffffffffff81111561136857600080fd5b6113748582860161119d565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b818110156113b45788810183015185820160c001528201611398565b818111156113c657600060c083870101525b50601f01601f1916830160c00191506113ec905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b6000806000806060858703121561142357600080fd5b61142c85611181565b935060208501359250604085013567ffffffffffffffff8082111561145057600080fd5b818701915087601f83011261146457600080fd5b81358181111561147357600080fd5b88602082850101111561148557600080fd5b95989497505060200194505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114bd576114bd611494565b500190565b6000828210156114d4576114d4611494565b500390565b600181811c908216806114ed57607f821691505b6020821081141561150e57634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061153057607f831692505b602080841082141561155057634e487b7160e01b86526022600452602486fd5b8180156115645760018114611575576115a2565b60ff198616895284890196506115a2565b60008c81526020902060005b8681101561159a5781548b820152908501908301611581565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 8ea3c70..2ee8a58 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -2,6 +2,12 @@ import SearchComponent from "../components/SearchComponent.vue"; import blockchain from "../utils/blockchain"; +// (TO DO) Tirar isso tudo daqui +import p2pix from "../utils/smart_contract_files/P2PIX.json"; +import addresses from "../utils/smart_contract_files/localhost.json"; +import { useEtherStore } from "@/store/ether"; +import { ethers } from "ethers"; + const confirmBuyClick = async ({ selectedDeposit, tokenValue }: any) => { // finish buy screen console.log(selectedDeposit); @@ -11,6 +17,32 @@ const confirmBuyClick = async ({ selectedDeposit, tokenValue }: any) => { .then((deposit) => (depositDetail = deposit)); console.log(tokenValue); console.log(depositDetail); + + // Makes lock with deposit ID and the Amount + if (depositDetail) { + const lock = await blockchain.addLock( + depositDetail.args.depositID, + tokenValue + ); + console.log(lock); + + // (TO DO) Tirar isso daqui + const window_ = window as any; + const connection = window_.ethereum; + let provider: ethers.providers.Web3Provider | null = null; + if (!connection) return; + provider = new ethers.providers.Web3Provider(connection); + const signer = provider.getSigner(); + const etherStore = useEtherStore(); + const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + const filterLocks = p2pContract.filters.LockAdded(null); + const eventsLocks = await p2pContract.queryFilter(filterLocks); + etherStore.setLocksAddedList(eventsLocks); + + // Data to QRCode + // Chave Pix = depositDetail.pixTarget + // Valor = tokenValue + } }; diff --git a/src/views/MockView.vue b/src/views/MockView.vue index 68ab74f..b958d43 100644 --- a/src/views/MockView.vue +++ b/src/views/MockView.vue @@ -5,38 +5,59 @@ import { ref } from "vue"; import { useEtherStore } from "../store/ether"; import blockchain from "../utils/blockchain"; +// Blockchain Data const etherStore = useEtherStore(); +const { depositsAddedList } = storeToRefs(etherStore); +const { locksAddedList } = storeToRefs(etherStore); -const { depositList } = storeToRefs(etherStore); - +// Buyer's flow Data const depositValue = ref(); const depositPixKey = ref(""); +// Split tokens between wallets in wallets.json const splitTokens = () => { blockchain.splitTokens(); }; +// Formatting methods +// Formats wallet address in 0x000...0000 format +const formatWalletAddress = (wallet: string): string => { + const walletAddressLength = wallet.length; + const initialText = wallet.substring(0, 5); + const finalText = wallet.substring( + walletAddressLength - 4, + walletAddressLength + ); + return `${initialText}...${finalText}`; +}; + +// Deposit methods +// Gets value and pix key from user's form to create a deposit in the blockchain const mockDeposit = () => { if (!depositValue.value || !depositPixKey.value) return; - blockchain.mockDeposit(depositValue.value.toString(), depositPixKey.value); -}; - -const countDeposit = () => { - blockchain.countDeposit(); + blockchain.addDeposit(depositValue.value.toString(), depositPixKey.value); }; +// Get specific deposit data by its ID const mapDeposit = (depositId: BigNumber) => { blockchain.mapDeposits(depositId); }; + +// Lock methods +// (TO DO) Releases lock by specific ID and other additional data +const releaseLock = () => { + blockchain.releaseLock(); +}; + +// Get specific lock data by its ID +const mapLock = (lockId: string) => { + blockchain.mapLocks(lockId); +};