@@ -22,6 +22,7 @@ import "./zeppelin/StandardToken.sol";
2222import "./zeppelin/ERC20.sol " ;
2323
2424import "./BasketRegistry.sol " ;
25+ import "./BasketSwap.sol " ;
2526
2627/// @title Basket -- Basket contract for bundling and debundling tokens
2728/// @author CoinAlpha, Inc. <[email protected] > @@ -40,7 +41,11 @@ contract Basket is StandardToken {
4041
4142 // mapping of token addresses to mapping of account balances
4243 // ADDRESS USER || ADDRESS TOKEN || UINT BALANCE
44+ <<<<<<< HEAD
4345 mapping (address => mapping (address => uint )) public outstandingBalance;
46+ =======
47+ mapping (address => mapping (address => uint )) public outstandingBalances;
48+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
4449
4550 // Modules
4651 IBasketRegistry public basketRegistry;
@@ -124,24 +129,50 @@ contract Basket is StandardToken {
124129 /// @param _quantity Quantity of basket tokens to convert back to original tokens
125130 /// @return success Operation successful
126131 function debundleAndWithdraw (uint _quantity ) public returns (bool success ) {
132+ <<<<<<< HEAD
127133 assert (debundle (_quantity, msg .sender , msg .sender ));
134+ =======
135+ assert (debundle (_quantity, msg .sender , msg .sender , true ));
136+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
128137 emit LogDebundleAndWithdraw (msg .sender , _quantity);
129138 return true ;
130139 }
131140
141+ <<<<<<< HEAD
142+ =======
143+ /// @dev Convert basketTokens back to original tokens (does not throw if single token transfer fails)
144+ /// @param _quantity Quantity of basket tokens to partial debundle
145+ /// @return success Operation successful
146+ function partialDebundle (uint _quantity ) public returns (bool success ) {
147+ assert (debundle (_quantity, msg .sender , msg .sender , false ));
148+ emit LogPartialDebundle (msg .sender , _quantity);
149+ return true ;
150+ }
151+
152+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
132153 /// @dev Convert basketTokens back to original tokens and transfer to swap contract and initiate swap
133154 /// @param _quantity Quantity of basket tokens to swap
134155 /// @param _sender Address of transaction sender
135156 /// @param _recipient Address of token recipient
157+ <<<<<<< HEAD
158+ =======
159+ /// @param _revertOnFailedTransfer If partial debundle is allowed (allow when tokens are paused / debundle function is stuck)
160+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
136161 /// @return success Operation successful
137162 function debundle (
138163 uint _quantity ,
139164 address _sender ,
165+ <<<<<<< HEAD
140166 address _recipient
167+ =======
168+ address _recipient ,
169+ bool _revertOnFailedTransfer
170+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
141171 ) internal returns (bool success ) {
142172 require (balances[_sender] >= _quantity, "Insufficient basket balance to debundle " );
143173 // decrease holder balance and total supply by _quantity
144174 balances[_sender] = balances[_sender].sub (_quantity);
175+ <<<<<<< HEAD
145176 totalSupply_ = totalSupply_.sub (_quantity);
146177
147178 // transfer tokens back to holder
@@ -160,24 +191,42 @@ contract Basket is StandardToken {
160191 /// @return success Operation successful
161192 function burn (uint _quantity ) public returns (bool success ) {
162193 balances[msg .sender ] = balances[msg .sender ].sub (_quantity);
194+ =======
195+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
163196 totalSupply_ = totalSupply_.sub (_quantity);
164197
165198 // increase outstanding balance of each of the tokens by their weights
166199 for (uint i = 0 ; i < tokens.length ; i++ ) {
167200 address t = tokens[i];
168201 uint w = weights[i];
202+ <<<<<<< HEAD
169203 outstandingBalance[msg .sender ][t] = outstandingBalance[msg .sender ][t].add (w.mul (_quantity).div (10 ** 18 ));
170204 }
171205
172206 basketRegistry.incrementBasketsBurned (_quantity, msg .sender );
207+ =======
208+ bool successfulTransfer = ERC20 (t).transfer (_recipient, w.mul (_quantity).div (10 ** 18 ));
209+ if (_revertOnFailedTransfer) {
210+ assert (successfulTransfer);
211+ } else if (successfulTransfer != true ) {
212+ outstandingBalances[_sender][t] = outstandingBalances[_sender][t].add (w.mul (_quantity).div (10 ** 18 ));
213+ }
214+ }
215+
216+ basketRegistry.incrementBasketsBurned (_quantity, _sender);
217+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
173218 return true ;
174219 }
175220
176221 /// @dev Allow holder to withdraw outstanding balances from contract (such as previously paused tokens)
177222 /// @param _token Address of token to withdraw
178223 /// @return success Operation successful
179224 function withdraw (address _token ) public returns (bool success ) {
225+ <<<<<<< HEAD
180226 uint bal = outstandingBalance[msg .sender ][_token];
227+ =======
228+ uint bal = outstandingBalances[msg .sender ][_token];
229+ >>>>>>> 2afada5ddf4d902117ef5d8299a56d7b65a3823c
181230 require (bal > 0 );
182231 assert (ERC20 (_token).transfer (msg .sender , bal));
183232
0 commit comments