This repository has been archived by the owner on Dec 10, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathBasketFactory.sol
135 lines (112 loc) · 4.51 KB
/
BasketFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
Copyright 2018 CoinAlpha, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
pragma solidity 0.4.21;
import "./zeppelin/SafeMath.sol";
import "./Basket.sol";
import "./BasketRegistry.sol";
/**
* @title BasketFactory -- Factory contract for creating different baskets
* @author CoinAlpha, Inc. <contact@coinalpha.com>
*/
contract BasketFactory {
using SafeMath for uint;
address public admin;
address public basketRegistryAddress;
address public productionFeeRecipient;
uint public productionFee;
// Modules
IBasketRegistry public basketRegistry;
// Modifiers
modifier onlyAdmin {
require(msg.sender == admin); // Check: "Only the admin can call this function"
_;
}
// Events
event LogBasketCreated(uint indexed basketIndex, address indexed basketAddress, address indexed arranger);
event LogProductionFeeRecipientChange(address indexed oldRecipient, address indexed newRecipient);
event LogProductionFeeChange(uint indexed oldFee, uint indexed newFee);
/// @dev BasketFactory constructor
/// @param _basketRegistryAddress Address of basket registry
function BasketFactory(
address _basketRegistryAddress,
address _productionFeeRecipient,
uint _productionFee
) public {
admin = msg.sender;
basketRegistryAddress = _basketRegistryAddress;
basketRegistry = IBasketRegistry(_basketRegistryAddress);
productionFeeRecipient = _productionFeeRecipient;
productionFee = _productionFee;
}
/// @dev Deploy a new basket
/// @param _name Name of new basket
/// @param _symbol Symbol of new basket
/// @param _tokens Token addresses of new basket
/// @param _weights Weight ratio addresses of new basket
/// @param _arrangerFeeRecipient Address to send arranger fees
/// @param _arrangerFee Amount of arranger fee to charge per basket minted
/// @return deployed basket
function createBasket(
string _name,
string _symbol,
address[] _tokens,
uint[] _weights,
address _arrangerFeeRecipient,
uint _arrangerFee
)
public
payable
returns (address newBasket)
{
// charging arrangers a fee to deploy new basket
require(msg.value >= productionFee); // Check: "Insufficient ETH for basket creation fee"
productionFeeRecipient.transfer(msg.value);
Basket b = new Basket(
_name,
_symbol,
_tokens,
_weights,
basketRegistryAddress,
msg.sender, // arranger address
_arrangerFeeRecipient,
_arrangerFee
);
emit LogBasketCreated(
basketRegistry.registerBasket(b, msg.sender, _name, _symbol, _tokens, _weights),
b,
msg.sender
);
return b;
}
/// @dev Change recipient of production fees
/// @param _newRecipient New fee recipient
/// @return success Operation successful
function changeProductionFeeRecipient(address _newRecipient) public onlyAdmin returns (bool success) {
address oldRecipient = productionFeeRecipient;
productionFeeRecipient = _newRecipient;
emit LogProductionFeeRecipientChange(oldRecipient, productionFeeRecipient);
return true;
}
/// @dev Change amount of fee charged for every basket created
/// @param _newFee New fee amount
/// @return success Operation successful
function changeProductionFee(uint _newFee) public onlyAdmin returns (bool success) {
uint oldFee = productionFee;
productionFee = _newFee;
emit LogProductionFeeChange(oldFee, productionFee);
return true;
}
/// @dev Fallback to reject any ether sent to contract
// Check: "BasketFactory does not accept ETH transfers"
function () public payable { revert(); }
}