diff --git a/src/store/ether.ts b/src/store/ether.ts index 4a56135..4655e9a 100644 --- a/src/store/ether.ts +++ b/src/store/ether.ts @@ -4,14 +4,19 @@ export const useEtherStore = defineStore("ether", { state: () => ({ walletAddress: "", balance: "", + // Depósitos válidos para compra - depositsValidList: [{}], + depositsValidList: [] as any[], // Depósitos adicionados na blockchain - depositsAddedList: [{}], + depositsAddedList: [] as any[], // Depósitos expirados na blockchain - depositsExpiredList: [{}], + depositsExpiredList: [] as any[], // Locks adicionados na blockchain - locksAddedList: [{}], + locksAddedList: [] as any[], + // Locks 'released' na blockchain + locksReleasedList: [] as any[], + // Locks expirados na blockchain + locksExpiredList: [] as any[] }), actions: { setWalletAddress(walletAddress: string) { @@ -32,5 +37,11 @@ export const useEtherStore = defineStore("ether", { setLocksAddedList(locksAddedList: any[]) { this.locksAddedList = locksAddedList; }, + setLocksReleasedList(locksReleasedList: any[]) { + this.locksReleasedList = locksReleasedList; + }, + setLocksExpiredList(locksExpiredList: any[]) { + this.locksExpiredList = locksExpiredList; + }, }, -}); +}); \ No newline at end of file diff --git a/src/utils/blockchain.ts b/src/utils/blockchain.ts index 246f8b6..868e290 100644 --- a/src/utils/blockchain.ts +++ b/src/utils/blockchain.ts @@ -8,8 +8,44 @@ import addresses from "./smart_contract_files/localhost.json"; // Mock wallets import import { wallets } from "./smart_contract_files/wallets.json"; -// Provider methods -const connectProvider = async () => { +// Wallet methods +// Update wallet state (balance and address) +const updateWalletStatus = async () => { + const etherStore = useEtherStore(); + const provider = getProvider(); + if (!provider) return; + + 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.setBalance(String(balance)); + etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress[0])); +}; + +// Split tokens between wallets in wallets.json +const splitTokens = async () => { + const provider = getProvider(); + if (!provider) return; + + const signer = provider.getSigner(); + const tokenContract = new ethers.Contract(addresses.token, mockToken.abi, signer); + + for (let i = 0; i < wallets.length; i++) { + const tx = await tokenContract.transfer( + wallets[i], + ethers.utils.parseEther("4000000.0") + ); + await tx.wait(); + updateWalletStatus(); + } +}; + +// Update store +const updateStore = async () => { const etherStore = useEtherStore(); const window_ = window as any; const connection = window_.ethereum; @@ -17,40 +53,44 @@ const connectProvider = async () => { if (!connection) return; provider = new ethers.providers.Web3Provider(connection); + const signer = provider.getSigner(); - const tokenContract = new ethers.Contract( - addresses.token, - mockToken.abi, - signer - ); + const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.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); + const filterDeposits = p2pContract.filters.DepositAdded(null); + const eventsDeposits = await p2pContract.queryFilter(filterDeposits); console.log("Deposits Added: ", eventsDeposits); etherStore.setDepositsAddedList(eventsDeposits); - const filterLocks = p2pEvents.filters.LockAdded(null); - const eventsLocks = await p2pEvents.queryFilter(filterLocks); + const filterLocks = p2pContract.filters.LockAdded(null); + const eventsLocks = await p2pContract.queryFilter(filterLocks); console.log("Locks Added: ", eventsLocks); etherStore.setLocksAddedList(eventsLocks); - const filterExpiredLocks = p2pEvents.filters.LockReturned(null); - const eventsExpiredLocks = await p2pEvents.queryFilter(filterExpiredLocks); + const filterReleasedLocks = p2pContract.filters.LockReleased(null); + const eventsReleasedLocks = await p2pContract.queryFilter(filterReleasedLocks); + console.log("Released Locks: ", eventsReleasedLocks); + etherStore.setLocksReleasedList(eventsReleasedLocks); + + const filterExpiredLocks = p2pContract.filters.LockReturned(null); + const eventsExpiredLocks = await p2pContract.queryFilter(filterExpiredLocks); console.log("Expired Locks: ", eventsExpiredLocks); - etherStore.setDepositsExpiredList(eventsExpiredLocks); + etherStore.setLocksExpiredList(eventsExpiredLocks); + // (TO DO) Filter valid deposits +} - connection.on("accountsChanged", (accounts: string[]) => { - updateWalletStatus(accounts[0]); +// Provider methods +const connectProvider = async () => { + const window_ = window as any; + const connection = window_.ethereum; + + await updateWalletStatus(); + await updateStore(); + + connection.on("accountsChanged", () => { + updateWalletStatus(); }); }; @@ -63,55 +103,24 @@ const getProvider = (): ethers.providers.Web3Provider | 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(); - if (!provider) return; - - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); - - const balance = await contract.balanceOf(walletAddress); - - etherStore.setBalance(String(balance)); - etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress)); -}; - -// Split tokens between wallets in wallets.json -const splitTokens = async () => { - const etherStore = useEtherStore(); - const provider = getProvider(); - if (!provider) return; - - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); - - for (let i = 0; i < wallets.length; i++) { - const tx = await contract.transfer( - wallets[i], - ethers.utils.parseEther("4000000.0") - ); - await tx.wait(); - updateWalletStatus(etherStore.walletAddress); - } -}; - // 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, signer ); - const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + const p2pContract = new ethers.Contract( + addresses.p2pix, + p2pix.abi, + signer + ); // First get the approval const apprv = await tokenContract.approve( @@ -128,13 +137,7 @@ const addDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => { ); await deposit.wait(); - updateWalletStatus(etherStore.walletAddress); - - const p2pEvents = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); - const filter = p2pEvents.filters.DepositAdded(null); - const events = await p2pEvents.queryFilter(filter); - - etherStore.setDepositsAddedList(events); + updateStore(); }; // Get specific deposit data by its ID @@ -162,7 +165,7 @@ const addLock = async (depositId: Number, amount: Number) => { const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); // Make lock - await p2pContract.lock( + const lock = await p2pContract.lock( depositId, etherStore.walletAddress, ethers.constants.AddressZero, @@ -170,10 +173,9 @@ const addLock = async (depositId: Number, amount: Number) => { ethers.utils.parseEther(amount.toString()), [] ); + lock.wait(); - const filterLocks = p2pContract.filters.LockAdded(null); - const eventsLocks = await p2pContract.queryFilter(filterLocks); - etherStore.setLocksAddedList(eventsLocks); + updateStore(); }; // Get specific lock data by its ID @@ -187,13 +189,62 @@ const mapLocks = async (lockId: string) => { const lock = await contract.mapLocks(lockId); console.log(lock); + + console.log("Expiration block = ", Number(lock.expirationBlock)) return lock; }; // Releases lock by specific ID and other additional data -// (TO DO) const releaseLock = async () => { - return; + const etherStore = useEtherStore(); + const provider = getProvider(); + if (!provider) return; + + const myLock = etherStore.locksAddedList[0]; + const lockId = myLock.args.lockID + const depositId = myLock.args.depositID + const amount = formatBigNumber(myLock.args.amount); + + const myDeposit = await mapDeposits(depositId); + const pixKey = myDeposit.pixTarget + + const e2eId = 123 + + console.log(pixKey, amount, e2eId) + + const mockBacenSigner = new ethers.Wallet("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") + + const messageToSign = ethers.utils.solidityKeccak256( + [ + "string", + "uint256", + "uint256" + ], + [ + pixKey, + ethers.utils.parseEther(amount), + e2eId + ] + ) + + const messageHashBytes = ethers.utils.arrayify(messageToSign); + const flatSig = await mockBacenSigner.signMessage(messageHashBytes); + const sig = ethers.utils.splitSignature(flatSig); + + const signer = provider.getSigner(); + const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer); + + const release = await p2pContract.release( + lockId, + e2eId, + sig.r, + sig.s, + sig.v + ) + release.wait() + console.log(release) + + updateStore(); }; // Formatting methods @@ -216,5 +267,5 @@ export default { formatBigNumber, addLock, mapLocks, - releaseLock, -}; + releaseLock +}; \ No newline at end of file