feat: add lock release method at blockchain util

Co-authored-by: brunoedcf <brest.dallacosta@outlook.com>
This commit is contained in:
RcleydsonR 2022-12-07 18:46:01 -03:00
parent e7ca40c30f
commit 1027744a83
2 changed files with 144 additions and 82 deletions

View File

@ -4,14 +4,19 @@ export const useEtherStore = defineStore("ether", {
state: () => ({ state: () => ({
walletAddress: "", walletAddress: "",
balance: "", balance: "",
// Depósitos válidos para compra // Depósitos válidos para compra
depositsValidList: [{}], depositsValidList: [] as any[],
// Depósitos adicionados na blockchain // Depósitos adicionados na blockchain
depositsAddedList: [{}], depositsAddedList: [] as any[],
// Depósitos expirados na blockchain // Depósitos expirados na blockchain
depositsExpiredList: [{}], depositsExpiredList: [] as any[],
// Locks adicionados na blockchain // Locks adicionados na blockchain
locksAddedList: [{}], locksAddedList: [] as any[],
// Locks 'released' na blockchain
locksReleasedList: [] as any[],
// Locks expirados na blockchain
locksExpiredList: [] as any[]
}), }),
actions: { actions: {
setWalletAddress(walletAddress: string) { setWalletAddress(walletAddress: string) {
@ -32,5 +37,11 @@ export const useEtherStore = defineStore("ether", {
setLocksAddedList(locksAddedList: any[]) { setLocksAddedList(locksAddedList: any[]) {
this.locksAddedList = locksAddedList; this.locksAddedList = locksAddedList;
}, },
setLocksReleasedList(locksReleasedList: any[]) {
this.locksReleasedList = locksReleasedList;
},
setLocksExpiredList(locksExpiredList: any[]) {
this.locksExpiredList = locksExpiredList;
},
}, },
}); });

View File

@ -8,8 +8,44 @@ import addresses from "./smart_contract_files/localhost.json";
// Mock wallets import // Mock wallets import
import { wallets } from "./smart_contract_files/wallets.json"; import { wallets } from "./smart_contract_files/wallets.json";
// Provider methods // Wallet methods
const connectProvider = async () => { // 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 etherStore = useEtherStore();
const window_ = window as any; const window_ = window as any;
const connection = window_.ethereum; const connection = window_.ethereum;
@ -17,40 +53,44 @@ const connectProvider = async () => {
if (!connection) return; if (!connection) return;
provider = new ethers.providers.Web3Provider(connection); provider = new ethers.providers.Web3Provider(connection);
const signer = provider.getSigner(); const signer = provider.getSigner();
const tokenContract = new ethers.Contract( const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer);
addresses.token,
mockToken.abi,
signer
);
const walletAddress = await provider.send("eth_requestAccounts", []); const filterDeposits = p2pContract.filters.DepositAdded(null);
const balance = await tokenContract.balanceOf(walletAddress[0]); const eventsDeposits = await p2pContract.queryFilter(filterDeposits);
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); console.log("Deposits Added: ", eventsDeposits);
etherStore.setDepositsAddedList(eventsDeposits); etherStore.setDepositsAddedList(eventsDeposits);
const filterLocks = p2pEvents.filters.LockAdded(null); const filterLocks = p2pContract.filters.LockAdded(null);
const eventsLocks = await p2pEvents.queryFilter(filterLocks); const eventsLocks = await p2pContract.queryFilter(filterLocks);
console.log("Locks Added: ", eventsLocks); console.log("Locks Added: ", eventsLocks);
etherStore.setLocksAddedList(eventsLocks); etherStore.setLocksAddedList(eventsLocks);
const filterExpiredLocks = p2pEvents.filters.LockReturned(null); const filterReleasedLocks = p2pContract.filters.LockReleased(null);
const eventsExpiredLocks = await p2pEvents.queryFilter(filterExpiredLocks); 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); console.log("Expired Locks: ", eventsExpiredLocks);
etherStore.setDepositsExpiredList(eventsExpiredLocks); etherStore.setLocksExpiredList(eventsExpiredLocks);
// (TO DO) Filter valid deposits // (TO DO) Filter valid deposits
}
connection.on("accountsChanged", (accounts: string[]) => { // Provider methods
updateWalletStatus(accounts[0]); 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); 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 // Deposit methods
// Gets value and pix key from user's form to create a deposit in the blockchain // 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 addDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => {
const etherStore = useEtherStore();
const provider = getProvider(); const provider = getProvider();
if (!provider) return; if (!provider) return;
const signer = provider.getSigner(); const signer = provider.getSigner();
const tokenContract = new ethers.Contract( const tokenContract = new ethers.Contract(
addresses.token, addresses.token,
mockToken.abi, mockToken.abi,
signer 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 // First get the approval
const apprv = await tokenContract.approve( const apprv = await tokenContract.approve(
@ -128,13 +137,7 @@ const addDeposit = async (tokenQty = "1000.0", pixKey = "00011122233") => {
); );
await deposit.wait(); await deposit.wait();
updateWalletStatus(etherStore.walletAddress); updateStore();
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);
}; };
// Get specific deposit data by its ID // 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); const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer);
// Make lock // Make lock
await p2pContract.lock( const lock = await p2pContract.lock(
depositId, depositId,
etherStore.walletAddress, etherStore.walletAddress,
ethers.constants.AddressZero, ethers.constants.AddressZero,
@ -170,10 +173,9 @@ const addLock = async (depositId: Number, amount: Number) => {
ethers.utils.parseEther(amount.toString()), ethers.utils.parseEther(amount.toString()),
[] []
); );
lock.wait();
const filterLocks = p2pContract.filters.LockAdded(null); updateStore();
const eventsLocks = await p2pContract.queryFilter(filterLocks);
etherStore.setLocksAddedList(eventsLocks);
}; };
// Get specific lock data by its ID // Get specific lock data by its ID
@ -187,13 +189,62 @@ const mapLocks = async (lockId: string) => {
const lock = await contract.mapLocks(lockId); const lock = await contract.mapLocks(lockId);
console.log(lock); console.log(lock);
console.log("Expiration block = ", Number(lock.expirationBlock))
return lock; return lock;
}; };
// Releases lock by specific ID and other additional data // Releases lock by specific ID and other additional data
// (TO DO)
const releaseLock = async () => { 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 // Formatting methods
@ -216,5 +267,5 @@ export default {
formatBigNumber, formatBigNumber,
addLock, addLock,
mapLocks, mapLocks,
releaseLock, releaseLock
}; };