diff --git a/docs/api/classes/modules_staking_staking_pool_service.StakingPoolService.md b/docs/api/classes/modules_staking_staking_pool_service.StakingPoolService.md index 2d56229c..f4bc288f 100644 --- a/docs/api/classes/modules_staking_staking_pool_service.StakingPoolService.md +++ b/docs/api/classes/modules_staking_staking_pool_service.StakingPoolService.md @@ -14,8 +14,11 @@ Abstraction over staking pool smart contract - [checkReward](modules_staking_staking_pool_service.StakingPoolService.md#checkreward) - [getContributionLimit](modules_staking_staking_pool_service.StakingPoolService.md#getcontributionlimit) +- [getEnd](modules_staking_staking_pool_service.StakingPoolService.md#getend) - [getHardCap](modules_staking_staking_pool_service.StakingPoolService.md#gethardcap) - [getStake](modules_staking_staking_pool_service.StakingPoolService.md#getstake) +- [getStart](modules_staking_staking_pool_service.StakingPoolService.md#getstart) +- [partialWithdraw](modules_staking_staking_pool_service.StakingPoolService.md#partialwithdraw) - [putStake](modules_staking_staking_pool_service.StakingPoolService.md#putstake) - [withdraw](modules_staking_staking_pool_service.StakingPoolService.md#withdraw) @@ -56,6 +59,16 @@ ___ ___ +### getEnd + +▸ **getEnd**(): `Promise`<`BigNumber`\> + +#### Returns + +`Promise`<`BigNumber`\> + +___ + ### getHardCap ▸ **getHardCap**(): `Promise`<`BigNumber`\> @@ -78,6 +91,34 @@ Stake ___ +### getStart + +▸ **getStart**(): `Promise`<`BigNumber`\> + +#### Returns + +`Promise`<`BigNumber`\> + +___ + +### partialWithdraw + +▸ **partialWithdraw**(`value`): `Promise`<`ContractReceipt`\> + +**`description`** + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `value` | `number` \| `BigNumber` | + +#### Returns + +`Promise`<`ContractReceipt`\> + +___ + ### putStake ▸ **putStake**(`stake`): `Promise`<`void`\> diff --git a/e2e/staking-pool.e2e.ts b/e2e/staking-pool.e2e.ts index 22d0fa0e..f63c4746 100644 --- a/e2e/staking-pool.e2e.ts +++ b/e2e/staking-pool.e2e.ts @@ -61,6 +61,9 @@ const ratioInt = utils.parseUnits(ratio.toString(), 18); const rewards = oneEWT.mul(11); +let poolStart; +let poolEnd; + export const setupStakingPoolFactory = async () => { const { chainId } = await deployer.provider.getNetwork(); const { claimManagerAddress } = chainConfigs()[chainId]; @@ -70,17 +73,14 @@ export const setupStakingPoolFactory = async () => { const start = timestamp + 10; const end = start + duration; - const stakingPoolFactory = await ( - await new StakingPool__factory(deployer).deploy( - claimManagerAddress, - start, - end, - ratioInt, - hardCap, - contributionLimit, - { value: rewards }, - ) - ).deployed(); + const stakingPoolFactory = await (await new StakingPool__factory(deployer).deploy()).deployed(); + + poolStart = start; + poolEnd = end; + + await stakingPoolFactory.init(claimManagerAddress, start, end, ratioInt, hardCap, contributionLimit, { + value: rewards, + }); setChainConfig(chainId, { stakingPoolFactoryAddress: stakingPoolFactory.address }); }; @@ -203,4 +203,33 @@ describe("StakingPool tests", () => { expect(poolContributionLimit.eq(contributionLimit)).toEqual(true); }); + + it("should be able to unstake", async () => { + const pool = await stakingPoolService.getPool(); + + await putStake(pool, 2); + + await pool.partialWithdraw(1); + await provider.send("evm_mine", []); + + const currentStake = await pool.getStake(); + expect(currentStake.amount.toNumber()).toBe(1); + expect(currentStake.status).toBe(StakeStatus.STAKING); + }); + + it("should return start of the pool", async () => { + const pool = await stakingPoolService.getPool(); + + const start = await pool.getStart(); + + expect(start.toNumber()).toBe(poolStart); + }); + + it("should return end of the pool", async () => { + const pool = await stakingPoolService.getPool(); + + const end = await pool.getEnd(); + + expect(end.toNumber()).toBe(poolEnd); + }); }); diff --git a/package-lock.json b/package-lock.json index 2c35f64b..7fa1400b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "iam-client-lib", - "version": "3.3.0-alpha.16", + "version": "3.3.0-alpha.18", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1688,9 +1688,9 @@ "dev": true }, "@energyweb/staking-pool": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@energyweb/staking-pool/-/staking-pool-1.0.0-rc.2.tgz", - "integrity": "sha512-JN2XJ8TULzmOZml5aX/CDlDIpMmMNTD+q+DdFO0MCaATQ/DyoFGdUlK+G9PZ/QZyVkamgrCpf7KmWAv/VKgzVA==" + "version": "1.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@energyweb/staking-pool/-/staking-pool-1.0.0-rc.5.tgz", + "integrity": "sha512-95TXWr5JWF65rYfXPkTCv3HUOa4ZsG0+kU8WhTLqqy3g2LTT/Mr6EBkv/ZOyQgxV+X6v8UzIjjm8rSUBVkD0pg==" }, "@ensdomains/buffer": { "version": "0.0.13", diff --git a/package.json b/package.json index df9c5e77..695a06af 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@babel/runtime": "^7.12.5", "@energyweb/ekc": "^0.6.4", "@energyweb/iam-contracts": "^3.5.0", - "@energyweb/staking-pool": "^1.0.0-rc.2", + "@energyweb/staking-pool": "^1.0.0-rc.5", "@ensdomains/ens": "^0.4.5", "@ew-did-registry/claims": "^0.6.3-alpha.262.0", "@ew-did-registry/did": "^0.6.3-alpha.262.0", diff --git a/src/modules/staking/staking-pool.service.ts b/src/modules/staking/staking-pool.service.ts index 239c326a..11431e4c 100644 --- a/src/modules/staking/staking-pool.service.ts +++ b/src/modules/staking/staking-pool.service.ts @@ -1,4 +1,4 @@ -import { BigNumber, providers, utils } from "ethers"; +import { BigNumber, ContractReceipt, providers, utils } from "ethers"; import { StakingPool as StakingPoolContract } from "../../../ethers-staking"; import { StakingPool__factory } from "../../../ethers-staking/factories/StakingPool__factory"; import { ERROR_MESSAGES } from "../../errors/ErrorMessages"; @@ -61,6 +61,14 @@ export class StakingPoolService { ).attach(address); } + async getStart(): Promise { + return this.pool.connect(this.signerService.signer).start(); + } + + async getEnd(): Promise { + return this.pool.connect(this.signerService.signer).end(); + } + async getHardCap(): Promise { return this.pool.connect(this.signerService.signer).hardCap(); } @@ -69,6 +77,18 @@ export class StakingPoolService { return this.pool.connect(this.signerService.signer).contributionLimit(); } + /** + * @description + * @param value + */ + async partialWithdraw(value: BigNumber | number): Promise { + value = BigNumber.from(value); + + const transaction = await this.pool.connect(this.signerService.signer).unstake(value); + + return transaction.wait(); + } + /** * @description Locks stake and starts accumulating reward * @emits StakingPool.StakePut