Skip to content
This repository was archived by the owner on Jul 6, 2022. It is now read-only.

Commit 16f540e

Browse files
author
Victor Wiebe
committed
feat: 🎸 addNewLockUpType method and tests
1 parent 258c367 commit 16f540e

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

‎src/contract_wrappers/modules/transfer_manager/__tests__/lock_up_transfer_manager_wrapper.test.ts‎

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,112 @@ describe('LockUpTransferManagerWrapper', () => {
592592
});
593593
});
594594

595+
596+
describe('addNewLockUpType', () => {
597+
test('should call addNewLockUpType', async () => {
598+
const expectedOwnerResult = '0x8888888888888888888888888888888888888888';
599+
const lockupName= 'Lockup1';
600+
const expectedDecimalsResult = new BigNumber(18);
601+
const expectedLockupAmount = valueToWei(new BigNumber(0), expectedDecimalsResult);
602+
const expectedStartTime = new BigNumber(0);
603+
const expectedLockUpPeriodSeconds = new BigNumber(0);
604+
const expectedReleaseFrequencySeconds = new BigNumber(0);
605+
const expectedUnlockedAmount = new BigNumber(0);
606+
const expectedGetLockupResult = [
607+
expectedLockupAmount,
608+
expectedStartTime,
609+
expectedLockUpPeriodSeconds,
610+
expectedReleaseFrequencySeconds,
611+
expectedUnlockedAmount,
612+
];
613+
const mockedGetLockupParams = {
614+
lockupName,
615+
};
616+
617+
// Security Token Address expected
618+
const expectedSecurityTokenAddress = '0x3333333333333333333333333333333333333333';
619+
// Setup get Security Token Address
620+
const mockedGetSecurityTokenAddressMethod = mock(MockedCallMethod);
621+
when(mockedContract.securityToken).thenReturn(instance(mockedGetSecurityTokenAddressMethod));
622+
when(mockedGetSecurityTokenAddressMethod.callAsync()).thenResolve(expectedSecurityTokenAddress);
623+
when(mockedContractFactory.getSecurityTokenContract(expectedSecurityTokenAddress)).thenResolve(
624+
instance(mockedSecurityTokenContract),
625+
);
626+
const mockedSecurityTokenDecimalsMethod = mock(MockedCallMethod);
627+
when(mockedSecurityTokenDecimalsMethod.callAsync()).thenResolve(expectedDecimalsResult);
628+
when(mockedSecurityTokenContract.decimals).thenReturn(instance(mockedSecurityTokenDecimalsMethod));
629+
const mockedSecurityTokenOwnerMethod = mock(MockedCallMethod);
630+
when(mockedSecurityTokenOwnerMethod.callAsync()).thenResolve(expectedOwnerResult);
631+
when(mockedSecurityTokenContract.owner).thenReturn(instance(mockedSecurityTokenOwnerMethod));
632+
633+
// Mock web3 wrapper owner
634+
when(mockedWrapper.getAvailableAddressesAsync()).thenResolve([expectedOwnerResult]);
635+
636+
// Mocked method
637+
const mockedGetLockupMethod = mock(MockedCallMethod);
638+
// Stub the method
639+
when(mockedContract.getLockUp).thenReturn(instance(mockedGetLockupMethod));
640+
// Stub the request
641+
when(mockedGetLockupMethod.callAsync(objectContaining(stringToBytes32(mockedGetLockupParams.lockupName)))).thenResolve(
642+
expectedGetLockupResult,
643+
);
644+
645+
const mockedParams = {
646+
lockupAmount: new BigNumber(100),
647+
startTime: new Date(2030, 1),
648+
lockUpPeriodSeconds: new BigNumber(3600),
649+
releaseFrequencySeconds: new BigNumber(60),
650+
lockupName,
651+
txData: {},
652+
safetyFactor: 10,
653+
};
654+
const expectedResult = getMockedPolyResponse();
655+
// Mocked method
656+
const mockedMethod = mock(MockedSendMethod);
657+
// Stub the method
658+
when(mockedContract.addNewLockUpType).thenReturn(instance(mockedMethod));
659+
// Stub the request
660+
when(
661+
mockedMethod.sendTransactionAsync(
662+
objectContaining(mockedParams.lockupAmount),
663+
objectContaining(dateToBigNumber(mockedParams.startTime)),
664+
objectContaining(mockedParams.lockUpPeriodSeconds),
665+
objectContaining(mockedParams.releaseFrequencySeconds),
666+
stringToBytes32(mockedParams.lockupName),
667+
mockedParams.txData,
668+
mockedParams.safetyFactor,
669+
),
670+
).thenResolve(expectedResult);
671+
672+
// Real call
673+
const result = await target.addNewLockUpType(mockedParams);
674+
675+
// Result expectation
676+
expect(result).toBe(expectedResult);
677+
// Verifications
678+
verify(mockedContract.addNewLockUpType).once();
679+
verify(
680+
mockedMethod.sendTransactionAsync(
681+
objectContaining(mockedParams.lockupAmount),
682+
objectContaining(dateToBigNumber(mockedParams.startTime)),
683+
objectContaining(mockedParams.lockUpPeriodSeconds),
684+
objectContaining(mockedParams.releaseFrequencySeconds),
685+
stringToBytes32(mockedParams.lockupName),
686+
mockedParams.txData,
687+
mockedParams.safetyFactor,
688+
),
689+
).once();
690+
verify(mockedSecurityTokenOwnerMethod.callAsync()).once();
691+
verify(mockedSecurityTokenContract.owner).once();
692+
verify(mockedContract.securityToken).twice();
693+
verify(mockedGetSecurityTokenAddressMethod.callAsync()).twice();
694+
verify(mockedContractFactory.getSecurityTokenContract(expectedSecurityTokenAddress)).twice();
695+
verify(mockedWrapper.getAvailableAddressesAsync()).once();
696+
verify(mockedContract.getLockUp).once();
697+
verify(mockedGetLockupMethod.callAsync(objectContaining(stringToBytes32(mockedGetLockupParams.lockupName)))).once();
698+
});
699+
});
700+
595701
describe('verifyTransfer', () => {
596702
test('should verify Transfer', async () => {
597703
const statusCode = new BigNumber(2);

‎src/contract_wrappers/modules/transfer_manager/lock_up_transfer_manager_wrapper.ts‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import {
3434
bigNumberToDate,
3535
bytes32ArrayToStringArray,
3636
bytes32ToString,
37+
dateToBigNumber,
38+
parseModuleTypeValue,
3739
parsePermBytes32Value,
3840
parseTransferResult,
3941
stringToBytes32,
@@ -155,6 +157,14 @@ interface VerifyTransferParams {
155157
data: string;
156158
}
157159

160+
interface AddNewLockUpTypeParams extends TxParams {
161+
lockupAmount: BigNumber;
162+
startTime: Date;
163+
lockUpPeriodSeconds: BigNumber;
164+
releaseFrequencySeconds: BigNumber;
165+
lockupName: string;
166+
}
167+
158168
// // Return types ////
159169
interface LockUp {
160170
lockupAmount: BigNumber;
@@ -342,6 +352,23 @@ export default class LockUpTransferManagerWrapper extends ModuleWrapper {
342352
};
343353
};
344354

355+
/*
356+
* addNewLockUpType
357+
*/
358+
public addNewLockUpType = async (params: AddNewLockUpTypeParams) => {
359+
assert.assert(await this.isCallerAllowed(params.txData, Perm.Admin), 'Caller is not allowed');
360+
await this.checkAddNewLockUpType(params);
361+
return (await this.contract).addNewLockUpType.sendTransactionAsync(
362+
params.lockupAmount,
363+
dateToBigNumber(params.startTime),
364+
params.lockUpPeriodSeconds,
365+
params.releaseFrequencySeconds,
366+
stringToBytes32(params.lockupName),
367+
params.txData,
368+
params.safetyFactor,
369+
);
370+
};
371+
345372
/**
346373
* Subscribe to an event type emitted by the contract.
347374
* @return Subscription token used later to unsubscribe
@@ -388,4 +415,17 @@ export default class LockUpTransferManagerWrapper extends ModuleWrapper {
388415
);
389416
return logs;
390417
};
418+
419+
private checkAddNewLockUpType = async (params: AddNewLockUpTypeParams) => {
420+
assert.assert(params.lockupName.length > 0, 'Lockup Name cannot be empty string');
421+
const lockup = await this.getLockUp({ lockupName: params.lockupName });
422+
assert.isBigNumberZero(lockup.lockupAmount, 'LockUp already exists');
423+
assert.isFutureDate(params.startTime, 'Start time must be in the future');
424+
assert.isBigNumberGreaterThanZero(params.lockUpPeriodSeconds, 'Lockup period in seconds should be greater than 0');
425+
assert.isBigNumberGreaterThanZero(
426+
params.releaseFrequencySeconds,
427+
'Release frequency in seconds should be greater than 0',
428+
);
429+
assert.isBigNumberGreaterThanZero(params.lockupAmount, 'Lockup amount should be greater than 0');
430+
};
391431
}

0 commit comments

Comments
 (0)