Skip to content
This repository was archived by the owner on Apr 3, 2019. It is now read-only.

Commit 50d9709

Browse files
committed
Add functions to instantiate SecurityToken and Template. Fix test errors. Remove unused properties from SecurityToken.
1 parent 1de4c62 commit 50d9709

File tree

7 files changed

+83
-66
lines changed

7 files changed

+83
-66
lines changed

src/contract_wrappers/Compliance.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Web3 from 'web3';
55
import { Web3Wrapper } from '@0xproject/web3-wrapper';
66

77
import ContractWrapper from './ContractWrapper';
8-
8+
import Template from './Template';
99
import complianceArtifact from '../artifacts/Compliance.json';
1010
import type {
1111
BlockRange,
@@ -81,7 +81,7 @@ export default class Compliance extends ContractWrapper {
8181
* @param fee Amount of POLY to use the template (held in escrow until issuance)
8282
* @param quorum Minimum percent of shareholders which need to vote to freeze
8383
* @param vestingPeriod Length of time to vest funds
84-
* @return The address of the created template
84+
* @return The created template
8585
*/
8686
async createTemplate(
8787
legalDelegateAddress: string,
@@ -94,7 +94,7 @@ export default class Compliance extends ContractWrapper {
9494
fee: BigNumber,
9595
quorum: BigNumber,
9696
vestingPeriod: BigNumber,
97-
): Promise<string> {
97+
): Promise<Template> {
9898
const receipt = await this._contract.createTemplate(
9999
offeringType,
100100
Web3.prototype.fromAscii(issuerJurisdiction),
@@ -110,16 +110,30 @@ export default class Compliance extends ContractWrapper {
110110
gas: 4000000,
111111
},
112112
);
113+
const logs = receipt.logs.filter(log => log.event === 'LogTemplateCreated');
114+
115+
if (logs.length === 0) {
116+
throw new Error('createTemplate couldn\'t find an event log.');
117+
}
113118

114-
for (let i = 0; i < receipt.logs.length; i++) {
115-
const log = receipt.logs[i];
119+
const address = logs[0].args._template;
116120

117-
if (log.event === 'LogTemplateCreated') {
118-
return log.args._template;
119-
}
121+
if (!address) {
122+
throw new Error('createTemplate couldn\'t get template address.');
120123
}
121124

122-
throw new Error('createTemplate should have emitted LogTemplateCreated.');
125+
return this.getTemplateFromAddress(address);
126+
}
127+
128+
/**
129+
* Instantiates a template given its contract address.
130+
* @param address The address of the template contract
131+
* @return The template instance
132+
*/
133+
async getTemplateFromAddress(address: string): Promise<Template> {
134+
const template = new Template(this._web3Wrapper, address);
135+
await template.initialize();
136+
return template;
123137
}
124138

125139
/**

src/contract_wrappers/SecurityToken.js

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,14 @@ export type LogNewWhitelistedAddress = {
3232
* Wrapper for the SecurityToken Solidity contract
3333
*/
3434
export default class SecurityToken extends ContractWrapper {
35-
polyToken: PolyToken;
36-
customers: Customers;
37-
compliance: Compliance;
38-
3935
/**
4036
* @hideconstructor
4137
*/
4238
constructor(
4339
web3Wrapper: Web3Wrapper,
44-
polyToken: PolyToken,
45-
customers: Customers,
46-
compliance: Compliance,
4740
deployedAddress: string,
4841
) {
4942
super(web3Wrapper, securityTokenArtifact, deployedAddress);
50-
51-
this.polyToken = polyToken;
52-
this.customers = customers;
53-
this.compliance = compliance;
5443
}
5544

5645
/**

src/contract_wrappers/SecurityTokenRegistrar.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import { Web3Wrapper } from '@0xproject/web3-wrapper';
44
import { BigNumber } from 'bignumber.js';
5+
56
import ContractWrapper from './ContractWrapper';
7+
import SecurityToken from './SecurityToken';
68
import securityTokenRegistrarArtifact from '../artifacts/SecurityTokenRegistrar.json';
79
import type {
810
BlockRange,
@@ -58,7 +60,7 @@ export default class SecurityTokenRegistrar extends ContractWrapper {
5860
}
5961

6062
/**
61-
* Creates a security token and stores it in the security token registry. Returns a promise of true it the security token was successfully created. This is done by event watching for the event {@link LogNewSecurityToken()}.
63+
* Creates a security token and stores it in the security token registry.
6264
*
6365
* @param creator The address from which the token is created
6466
* @param name Name of the security token
@@ -72,6 +74,7 @@ export default class SecurityTokenRegistrar extends ContractWrapper {
7274
* @param type Type of security being tokenized (NEED TOKEN NUMBERS ie. security:1, somethingelse:2)
7375
* @param lockupPeriod Length of time (unix) raised POLY will be locked up for dispute
7476
* @param quorum Percent of initial investors required to freeze POLY raise
77+
* @return The security token created
7578
*/
7679
async createSecurityToken(
7780
creator: string,
@@ -86,8 +89,8 @@ export default class SecurityTokenRegistrar extends ContractWrapper {
8689
type: number,
8790
lockupPeriod: BigNumber,
8891
quorum: number,
89-
) {
90-
await this._contract.createSecurityToken(
92+
): Promise<SecurityToken> {
93+
const receipt = await this._contract.createSecurityToken(
9194
name,
9295
ticker,
9396
totalSupply,
@@ -104,6 +107,19 @@ export default class SecurityTokenRegistrar extends ContractWrapper {
104107
gas: 6700000,
105108
},
106109
);
110+
const logs = receipt.logs.filter(log => log.event === 'LogNewSecurityToken');
111+
112+
if (logs.length === 0) {
113+
throw new Error('createSecurityToken couldn\'t find an event log.');
114+
}
115+
116+
const address = logs[0].args.securityTokenAddress;
117+
118+
if (!address) {
119+
throw new Error('createSecurityToken couldn\'t get security token address.');
120+
}
121+
122+
return this.getSecurityTokenByAddress(address);
107123
}
108124

109125
/**
@@ -122,6 +138,17 @@ export default class SecurityTokenRegistrar extends ContractWrapper {
122138
return dataToNumber;
123139
}
124140

141+
/**
142+
* Instantiates a `SecurityToken` given its contract address.
143+
* @param address The address of the security tokens
144+
* @return The security token instance
145+
*/
146+
async getSecurityTokenByAddress(address: string): Promise<SecurityToken> {
147+
const securityToken = new SecurityToken(this._web3Wrapper, address);
148+
await securityToken.initialize();
149+
return securityToken;
150+
}
151+
125152
/**
126153
* Getter function for ST addresses by passing the ticker/symbol as the argument.
127154
* @param ticker The security token ticker

test/Compliance_test.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ describe('Compliance wrapper', () => {
8686
it('createTemplate', async () => {
8787
await makeKYCProvider(customers, accounts[1], expiryTime);
8888
await makeLegalDelegate(polyToken, customers, accounts[1], accounts[2], expiryTime);
89-
const templateAddress = await makeTemplate(
89+
const templateAddress = (await makeTemplate(
9090
compliance,
9191
accounts[1],
9292
accounts[2],
9393
expiryTime,
94-
);
94+
)).address;
9595

9696
assert.isAbove(templateAddress.length, 0);
9797
});
@@ -135,13 +135,12 @@ describe('Compliance wrapper', () => {
135135

136136
await makeKYCProvider(customers, accounts[1]);
137137
await makeLegalDelegate(polyToken, customers, accounts[1], accounts[2], expiryTime);
138-
const templateAddress = await makeTemplateWithFinalized(
138+
const templateAddress = (await makeTemplateWithFinalized(
139139
compliance,
140140
accounts[1],
141141
accounts[2],
142142
expiryTime,
143-
144-
);
143+
)).address;
145144

146145

147146
// Propose Template
@@ -235,12 +234,12 @@ describe('Compliance wrapper', () => {
235234
await makeKYCProvider(customers, kycProvider);
236235

237236
await makeLegalDelegate(polyToken, customers, accounts[1], accounts[2], expiryTime);
238-
const templateAddress = await makeTemplateWithFinalized(
237+
const templateAddress = (await makeTemplateWithFinalized(
239238
compliance,
240239
kycProvider,
241240
legalDelegate,
242241
expiryTime,
243-
);
242+
)).address;
244243

245244
await makeSelectedTemplateForSecurityToken(
246245
securityToken,
@@ -325,12 +324,12 @@ describe('Compliance wrapper', () => {
325324

326325
await makeKYCProvider(customers, accounts[1]);
327326
await makeLegalDelegate(polyToken, customers, accounts[1], accounts[2], expiryTime);
328-
const templateAddress = await makeTemplate(
327+
const templateAddress = (await makeTemplate(
329328
compliance,
330329
accounts[1],
331330
accounts[2],
332331
expiryTime,
333-
);
332+
)).address;
334333

335334
const logTemplateCreated = await logTemplateCreatedArgsPromise;
336335
assert.equal(logTemplateCreated._creator, accounts[2], 'legal delegate creator address wasnt found in event subscription'); //'offeringtype' from make_examples.js

test/SecurityTokenRegistrar_test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import BigNumber from 'bignumber.js';
22
import chai from 'chai';
33
import 'mocha';
4+
import Web3 from 'web3';
45

56
import {
67
makePolyToken,
@@ -49,7 +50,6 @@ describe('Registrar wrapper', () => {
4950
polyToken,
5051
customers,
5152
compliance,
52-
securityToken,
5353
accounts[0],
5454
);
5555

@@ -79,7 +79,7 @@ describe('Registrar wrapper', () => {
7979
const quorum = 75;
8080

8181
await polyToken.approve(owner, registrar.address, fee);
82-
await registrar.createSecurityToken(
82+
const securityToken = await registrar.createSecurityToken(
8383
creator,
8484
name,
8585
ticker,
@@ -94,6 +94,8 @@ describe('Registrar wrapper', () => {
9494
quorum,
9595
);
9696

97+
assert(Web3.prototype.isAddress(securityToken.address), 'Returned security token has valid address.');
98+
9799
const logs = await registrar.getLogs(
98100
'LogNewSecurityToken',
99101
{},

test/SecurityToken_test.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,12 @@ describe('SecurityToken wrapper', () => {
155155

156156
await makeKYCProvider(customers, kycProvider, expiryTime);
157157
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
158-
const templateAddress = await makeTemplateWithFinalized(
158+
const templateAddress = (await makeTemplateWithFinalized(
159159
compliance,
160160
kycProvider,
161161
legalDelegate,
162162
expiryTime,
163-
);
163+
)).address;
164164

165165
await compliance.proposeTemplate(
166166
legalDelegate,
@@ -255,12 +255,12 @@ describe('SecurityToken wrapper', () => {
255255

256256
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
257257

258-
const templateAddress = await makeTemplateWithFinalized(
258+
const templateAddress = (await makeTemplateWithFinalized(
259259
compliance,
260260
kycProvider,
261261
legalDelegate,
262262
expiryTime,
263-
);
263+
)).address;
264264
await makeSelectedTemplateForSecurityToken(
265265
securityToken,
266266
compliance,
@@ -325,12 +325,12 @@ describe('SecurityToken wrapper', () => {
325325

326326
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
327327

328-
const templateAddress = await makeTemplateWithFinalized(
328+
const templateAddress = (await makeTemplateWithFinalized(
329329
compliance,
330330
kycProvider,
331331
legalDelegate,
332332
expiryTime,
333-
);
333+
)).address;
334334
// Create the Selected Template for the SecurityToken
335335
await makeSelectedTemplateForSecurityToken(
336336
securityToken,
@@ -406,12 +406,12 @@ describe('SecurityToken wrapper', () => {
406406

407407
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
408408

409-
const templateAddress = await makeTemplateWithFinalized(
409+
const templateAddress = (await makeTemplateWithFinalized(
410410
compliance,
411411
kycProvider,
412412
legalDelegate,
413413
expiryTime,
414-
);
414+
)).address;
415415
await makeSelectedTemplateForSecurityToken(
416416
securityToken,
417417
compliance,
@@ -659,12 +659,12 @@ describe('SecurityToken wrapper', () => {
659659
await makeKYCProvider(customers, kycProvider);
660660

661661
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
662-
const templateAddress = await makeTemplateWithFinalized(
662+
const templateAddress = (await makeTemplateWithFinalized(
663663
compliance,
664664
kycProvider,
665665
legalDelegate,
666666
expiryTime,
667-
);
667+
)).address;
668668

669669
await makeSelectedTemplateForSecurityToken(
670670
securityToken,
@@ -784,12 +784,12 @@ describe('SecurityToken wrapper', () => {
784784

785785
await makeLegalDelegate(polyToken, customers, kycProvider, legalDelegate, expiryTime);
786786

787-
const templateAddress = await makeTemplateWithFinalized(
787+
const templateAddress = (await makeTemplateWithFinalized(
788788
compliance,
789789
kycProvider,
790790
legalDelegate,
791791
expiryTime,
792-
);
792+
)).address;
793793
await makeSelectedTemplateForSecurityToken(
794794
securityToken,
795795
compliance,

0 commit comments

Comments
 (0)