forked from zeriontech/defi-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BancorTokenAdapter.sol
executable file
·137 lines (118 loc) · 4.74 KB
/
BancorTokenAdapter.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
136
137
// Copyright (C) 2020 Zerion Inc. <https://zerion.io>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
pragma solidity 0.6.5;
pragma experimental ABIEncoderV2;
import { ERC20 } from "../../ERC20.sol";
import { TokenMetadata, Component } from "../../Structs.sol";
import { TokenAdapter } from "../TokenAdapter.sol";
/**
* @dev SmartToken contract interface.
* Only the functions required for BancorTokenAdapter contract are added.
* The SmartToken contract is available here
* github.com/bancorprotocol/contracts/blob/master/solidity/contracts/token/SmartToken.sol.
*/
interface SmartToken {
function owner() external view returns (address);
function totalSupply() external view returns (uint256);
}
/**
* @dev BancorConverter contract interface.
* Only the functions required for BancorTokenAdapter contract are added.
* The BancorConverter contract is available here
* github.com/bancorprotocol/contracts/blob/master/solidity/contracts/converter/BancorConverter.sol.
*/
interface BancorConverter {
function connectorTokenCount() external view returns (uint256);
function connectorTokens(uint256) external view returns (address);
}
/**
* @dev ContractRegistry contract interface.
* Only the functions required for BancorTokenAdapter contract are added.
* The ContractRegistry contract is available here
* github.com/bancorprotocol/contracts/blob/master/solidity/contracts/utility/ContractRegistry.sol.
*/
interface ContractRegistry {
function addressOf(bytes32) external view returns (address);
}
/**
* @dev BancorFormula contract interface.
* Only the functions required for BancorTokenAdapter contract are added.
* The BancorFormula contract is available here
* github.com/bancorprotocol/contracts/blob/master/solidity/contracts/converter/BancorFormula.sol.
*/
interface BancorFormula {
function calculateLiquidateReturn(
uint256,
uint256,
uint32,
uint256
)
external
view
returns (uint256);
}
/**
* @title Token adapter for SmartTokens.
* @dev Implementation of TokenAdapter interface.
* @author Igor Sobolev <[email protected]>
*/
contract BancorTokenAdapter is TokenAdapter {
address internal constant REGISTRY = 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4;
address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
/**
* @return TokenMetadata struct with ERC20-style token info.
* @dev Implementation of TokenAdapter interface function.
*/
function getMetadata(address token) external view override returns (TokenMetadata memory) {
return TokenMetadata({
token: token,
name: ERC20(token).name(),
symbol: ERC20(token).symbol(),
decimals: ERC20(token).decimals()
});
}
/**
* @return Array of Component structs with underlying tokens rates for the given token.
* @dev Implementation of TokenAdapter interface function.
*/
function getComponents(address token) external view override returns (Component[] memory) {
address formula = ContractRegistry(REGISTRY).addressOf("BancorFormula");
uint256 totalSupply = SmartToken(token).totalSupply();
address converter = SmartToken(token).owner();
uint256 connectorTokenCount = BancorConverter(converter).connectorTokenCount();
Component[] memory underlyingTokens = new Component[](connectorTokenCount);
address underlyingToken;
uint256 balance;
for (uint256 i = 0; i < connectorTokenCount; i++) {
underlyingToken = BancorConverter(converter).connectorTokens(i);
if (underlyingToken == ETH) {
balance = converter.balance;
} else {
balance = ERC20(underlyingToken).balanceOf(converter);
}
underlyingTokens[i] = Component({
token: underlyingToken,
tokenType: "ERC20",
rate: BancorFormula(formula).calculateLiquidateReturn(
totalSupply,
balance,
uint32(1000000),
uint256(1e18)
)
});
}
return underlyingTokens;
}
}