Skip to content

Commit 6adbabd

Browse files
committed
Address comments and add integration tests for Sushi wrap adapter
1 parent 445cdde commit 6adbabd

File tree

8 files changed

+410
-115
lines changed

8 files changed

+410
-115
lines changed

contracts/protocol/integration/SushiBarWrapAdapter.sol

-109
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/*
2+
Copyright 2021 Set Labs Inc.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
16+
SPDX-License-Identifier: Apache License, Version 2.0
17+
*/
18+
19+
pragma solidity 0.6.10;
20+
21+
/**
22+
* @title SushiBarWrapAdapter
23+
* @author Yam Finance, Set Protocol
24+
*
25+
* Wrap adapter for depositing/withdrawing Sushi to/from SushiBar (xSushi)
26+
*/
27+
contract SushiBarWrapAdapter {
28+
29+
/* ============ State Variables ============ */
30+
31+
// Address of SUSHI token
32+
address public immutable sushiToken;
33+
34+
// Address of xSUSHI token
35+
address public immutable xSushiToken;
36+
37+
/* ============ Constructor ============ */
38+
39+
/**
40+
* Set state variables
41+
*
42+
* @param _sushiToken Address of SUSHI token
43+
* @param _xSushiToken Address of xSUSHI token
44+
*/
45+
constructor(address _sushiToken, address _xSushiToken) public {
46+
sushiToken = _sushiToken;
47+
xSushiToken = _xSushiToken;
48+
}
49+
50+
/* ============ External Functions ============ */
51+
52+
/**
53+
* Generates the calldata to wrap Sushi into xSushi.
54+
*
55+
* @param _underlyingToken Address of SUSHI token
56+
* @param _wrappedToken Address of xSUSHI token
57+
* @param _underlyingUnits Total quantity of SUSHI units to wrap
58+
*
59+
* @return address Target contract address
60+
* @return uint256 Unused, always 0
61+
* @return bytes Wrap calldata
62+
*/
63+
function getWrapCallData(
64+
address _underlyingToken,
65+
address _wrappedToken,
66+
uint256 _underlyingUnits
67+
)
68+
external
69+
view
70+
returns (address, uint256, bytes memory)
71+
{
72+
_validateWrapInputs(_underlyingToken, _wrappedToken);
73+
74+
// Signature for wrapping in xSUSHI is enter(uint256 _amount)
75+
bytes memory callData = abi.encodeWithSignature("enter(uint256)", _underlyingUnits);
76+
77+
return (xSushiToken, 0, callData);
78+
}
79+
80+
/**
81+
* Generates the calldata to unwrap xSushi to Sushi
82+
*
83+
* @param _underlyingToken Address of SUSHI token
84+
* @param _wrappedToken Address of xSUSHI token
85+
* @param _wrappedTokenUnits Total quantity of xSUSHI units to unwrap
86+
*
87+
* @return address Target contract address
88+
* @return uint256 Unused, always 0
89+
* @return bytes Unwrap calldata
90+
*/
91+
function getUnwrapCallData(
92+
address _underlyingToken,
93+
address _wrappedToken,
94+
uint256 _wrappedTokenUnits
95+
)
96+
external
97+
view
98+
returns (address, uint256, bytes memory)
99+
{
100+
_validateWrapInputs(_underlyingToken, _wrappedToken);
101+
102+
// Signature for unwrapping in xSUSHI is leave(uint256 _amount)
103+
bytes memory callData = abi.encodeWithSignature("leave(uint256)", _wrappedTokenUnits);
104+
105+
return (xSushiToken, 0, callData);
106+
107+
}
108+
109+
/**
110+
* Returns the address to approve source tokens for wrapping.
111+
*
112+
* @return address Address of the contract to approve tokens to. This is the SushiBar (xSushi) contract.
113+
*/
114+
function getSpenderAddress(address /*_underlyingToken*/, address /*_wrappedToken*/) external view returns(address) {
115+
return address(xSushiToken);
116+
}
117+
118+
/* ============ Internal Functions ============ */
119+
120+
/**
121+
* Validate inputs prior to getting wrap and unwrap calldata.
122+
*
123+
* @param _underlyingToken Address of SUSHI token
124+
* @param _wrappedToken Address of xSUSHI token
125+
*/
126+
function _validateWrapInputs(address _underlyingToken, address _wrappedToken) internal view {
127+
require(_underlyingToken == sushiToken, "Underlying token must be SUSHI");
128+
require(_wrappedToken == xSushiToken, "Wrapped token must be xSUSHI");
129+
}
130+
}

0 commit comments

Comments
 (0)