work contract flow
This commit is contained in:
		
							parent
							
								
									71a1d3b529
								
							
						
					
					
						commit
						ff25ff3382
					
				| 
						 | 
				
			
			@ -40,6 +40,7 @@ contract Work1 is IAcceptAvailability {
 | 
			
		|||
    uint constant POOL_DURATION = 1 days;
 | 
			
		||||
 | 
			
		||||
    event WorkAssigned(address worker, uint requestIndex);
 | 
			
		||||
    event WorkEvidenceSubmitted(uint requestIndex);
 | 
			
		||||
 | 
			
		||||
    constructor(DAO dao_, uint price_) {
 | 
			
		||||
        dao = dao_;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +91,7 @@ contract Work1 is IAcceptAvailability {
 | 
			
		|||
            if (block.timestamp > stakes[i].endTime) continue;
 | 
			
		||||
            totalStakes += stakes[i].amount;
 | 
			
		||||
        }
 | 
			
		||||
        require(totalStakes > 0, "No available worker stakes");
 | 
			
		||||
        uint select = block.prevrandao % totalStakes;
 | 
			
		||||
        uint acc;
 | 
			
		||||
        for (uint i = 0; i < stakeCount; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +100,7 @@ contract Work1 is IAcceptAvailability {
 | 
			
		|||
            acc += stakes[i].amount;
 | 
			
		||||
            if (acc > select) return i;
 | 
			
		||||
        }
 | 
			
		||||
        revert("Failed to select worker");
 | 
			
		||||
        revert("Failed to assign worker"); // Should never get here
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Assign a random available worker
 | 
			
		||||
| 
						 | 
				
			
			@ -126,6 +128,7 @@ contract Work1 is IAcceptAvailability {
 | 
			
		|||
        AvailabilityStake storage stake = stakes[request.stakeIndex];
 | 
			
		||||
        require(stake.worker == msg.sender);
 | 
			
		||||
        request.status = WorkStatus.EvidenceSubmitted;
 | 
			
		||||
        emit WorkEvidenceSubmitted(requestIndex);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Accept work approval/disapproval from customer
 | 
			
		||||
| 
						 | 
				
			
			@ -136,7 +139,7 @@ contract Work1 is IAcceptAvailability {
 | 
			
		|||
        request.status = WorkStatus.ApprovalSubmitted;
 | 
			
		||||
        request.approval = approval;
 | 
			
		||||
        // Initiate validation pool
 | 
			
		||||
        request.poolIndex = dao.initiateValidationPool(
 | 
			
		||||
        request.poolIndex = dao.initiateValidationPool{value: request.fee}(
 | 
			
		||||
            stake.worker,
 | 
			
		||||
            POOL_DURATION
 | 
			
		||||
        );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,15 @@
 | 
			
		|||
const {
 | 
			
		||||
  time,
 | 
			
		||||
  loadFixture,
 | 
			
		||||
  // setPrevRandao,
 | 
			
		||||
} = require('@nomicfoundation/hardhat-toolbox/network-helpers');
 | 
			
		||||
const { expect } = require('chai');
 | 
			
		||||
const { ethers } = require('hardhat');
 | 
			
		||||
 | 
			
		||||
describe('Work1', () => {
 | 
			
		||||
  const WORK1_PRICE = 100;
 | 
			
		||||
  const STAKE_DURATION = 60;
 | 
			
		||||
  const STAKE_AMOUNT = 50;
 | 
			
		||||
  async function deploy() {
 | 
			
		||||
    // Contracts are deployed using the first signer/account by default
 | 
			
		||||
    const [account1, account2] = await ethers.getSigners();
 | 
			
		||||
| 
						 | 
				
			
			@ -36,13 +39,71 @@ describe('Work1', () => {
 | 
			
		|||
 | 
			
		||||
  it('Should be able to receive availability stake', async () => {
 | 
			
		||||
    const { dao, work1, account1 } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, 50, 60);
 | 
			
		||||
    expect(await dao.balanceOf(account1)).to.equal(50);
 | 
			
		||||
    expect(await dao.balanceOf(work1.target)).to.equal(50);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION);
 | 
			
		||||
    expect(await dao.balanceOf(account1)).to.equal(STAKE_AMOUNT);
 | 
			
		||||
    expect(await dao.balanceOf(work1.target)).to.equal(STAKE_AMOUNT);
 | 
			
		||||
    expect(await work1.stakeCount()).to.equal(1);
 | 
			
		||||
    const stake = await work1.stakes(0);
 | 
			
		||||
    expect(stake.worker).to.equal(account1);
 | 
			
		||||
    expect(stake.amount).to.equal(50);
 | 
			
		||||
    expect(stake.endTime).to.equal(await time.latest() + 60);
 | 
			
		||||
    expect(stake.amount).to.equal(STAKE_AMOUNT);
 | 
			
		||||
    expect(stake.endTime).to.equal(await time.latest() + STAKE_DURATION);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should be able to request work and assign to a worker', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      dao, work1, account1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION, { from: account1 });
 | 
			
		||||
    const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(account1, 0);
 | 
			
		||||
    expect(await work1.requestCount()).to.equal(1);
 | 
			
		||||
    const request = await work1.requests(0);
 | 
			
		||||
    expect(request.customer).to.equal(account2);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should not be able to request work if there are no availability stakes', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      work1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await expect(requestWork()).to.be.revertedWith('No available worker stakes');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should not assign work to an expired availability stake', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      dao, work1, account1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION, { from: account1 });
 | 
			
		||||
    const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await time.increase(61);
 | 
			
		||||
    await expect(requestWork()).to.be.revertedWith('No available worker stakes');
 | 
			
		||||
  });
 | 
			
		||||
  it('should not assign work to the same availability stake twice', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      dao, work1, account1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION, { from: account1 });
 | 
			
		||||
    const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(account1, 0);
 | 
			
		||||
    await expect(requestWork()).to.be.revertedWith('No available worker stakes');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should be able to submit work evidence', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      dao, work1, account1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION, { from: account1 });
 | 
			
		||||
    await work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await expect(work1.submitWorkEvidence(0)).to.emit(work1, 'WorkEvidenceSubmitted').withArgs(0);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should be able to submit work approval', async () => {
 | 
			
		||||
    const {
 | 
			
		||||
      dao, work1, account1, account2,
 | 
			
		||||
    } = await loadFixture(deploy);
 | 
			
		||||
    await dao.stakeAvailability(work1.target, STAKE_AMOUNT, STAKE_DURATION, { from: account1 });
 | 
			
		||||
    await work1.connect(account2).requestWork({ value: WORK1_PRICE });
 | 
			
		||||
    await work1.submitWorkEvidence(0);
 | 
			
		||||
    await expect(work1.submitWorkApproval(0, true)).to.emit(dao, 'ValidationPoolInitiated').withArgs(1);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue