mirror of
https://github.com/grassrootseconomics/erc20-pool.git
synced 2024-11-07 06:26:47 +01:00
Initial commit
This commit is contained in:
commit
a4fc3c1dda
12
solidity/Makefile
Normal file
12
solidity/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
SOLC = /usr/bin/solc
|
||||
|
||||
all:
|
||||
$(SOLC) --bin SwapPool.sol --evm-version byzantium | awk 'NR>3' > SwapPool.bin
|
||||
$(SOLC) --abi SwapPool.sol --evm-version byzantium | awk 'NR>3' > SwapPool.json
|
||||
$(SOLC) --metadata SwapPool.sol --evm-version byzantium | awk 'NR>3' > SwapPool.metadata.json
|
||||
truncate -s -1 SwapPool.bin
|
||||
|
||||
install: all
|
||||
cp -v *.json ../python/erc20_swap_pool/data/
|
||||
cp -v *.bin ../python/erc20_swap_pool/data/
|
||||
|
101
solidity/SwapPool.sol
Normal file
101
solidity/SwapPool.sol
Normal file
@ -0,0 +1,101 @@
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// File-Version: 1
|
||||
// Description: Voting contract using ERC20 tokens as shares
|
||||
|
||||
contract SwapPool {
|
||||
address registry;
|
||||
address quoter;
|
||||
uint256 feePpm;
|
||||
address feeAddress;
|
||||
uint256 public totalSupply;
|
||||
mapping ( address => uint256 ) fees;
|
||||
|
||||
constructor(address _tokenRegistry) {
|
||||
registry = _tokenRegistry;
|
||||
}
|
||||
|
||||
function deposit(address _token, uint256 _value) public {
|
||||
bool r;
|
||||
bytes memory v;
|
||||
|
||||
allowedToken(_token, registry);
|
||||
|
||||
(r, v) = _token.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', msg.sender, this, _value));
|
||||
require(r, "ERR_TOKEN");
|
||||
r = abi.decode(v, (bool));
|
||||
require(r, "ERR_TRANSFER");
|
||||
}
|
||||
|
||||
function getFee(uint256 _value) private view returns (uint256) {
|
||||
uint256 fee;
|
||||
|
||||
fee = _value * feePpm;
|
||||
fee /= 1000000;
|
||||
|
||||
return fee;
|
||||
}
|
||||
|
||||
function getQuote(address _outToken, address _inToken, uint256 _value) private returns (uint256) {
|
||||
bool r;
|
||||
bytes memory v;
|
||||
uint256 quote;
|
||||
|
||||
if (quoter == address(0x0)) {
|
||||
return _value;
|
||||
}
|
||||
|
||||
(r, v) = quoter.call(abi.encodeWithSignature('valueFor(address,address,uint256)', _outToken, _inToken, _value));
|
||||
require(r, "ERR_QUOTER");
|
||||
quote = abi.decode(v, (uint256));
|
||||
return quote;
|
||||
}
|
||||
|
||||
function withdraw(address _outToken, address _inToken, uint256 _value) public {
|
||||
bool r;
|
||||
bytes memory v;
|
||||
uint256 netValue;
|
||||
uint256 balance;
|
||||
uint256 fee;
|
||||
|
||||
fee = getFee(_value);
|
||||
netValue = _value - fee;
|
||||
netValue = getQuote(_outToken, _inToken, netValue);
|
||||
|
||||
(r, v) = _outToken.call(abi.encodeWithSignature("balanceOf(address)", this));
|
||||
require(r, "ERR_TOKEN");
|
||||
balance = abi.decode(v, (uint256));
|
||||
require(balance >= netValue + fee, "ERR_BALANCE");
|
||||
|
||||
deposit(_inToken, _value);
|
||||
|
||||
(r, v) = _outToken.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', this, msg.sender, netValue));
|
||||
require(r, "ERR_TOKEN");
|
||||
r = abi.decode(v, (bool));
|
||||
require(r, "ERR_TRANSFER");
|
||||
|
||||
if (feeAddress != address(0)) {
|
||||
fees[_outToken] += fee;
|
||||
}
|
||||
}
|
||||
|
||||
function withdraw(address _token, uint256 _value) public returns (uint256) {
|
||||
|
||||
}
|
||||
|
||||
function allowedToken(address _token, address _registry) private {
|
||||
bool r;
|
||||
bytes memory v;
|
||||
|
||||
if (_registry == address(0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
(r, v) = _registry.call(abi.encodeWithSignature('have(address)', _token));
|
||||
require(r, "ERR_REGISTRY");
|
||||
r = abi.decode(v, (bool));
|
||||
require(r, "ERR_UNAUTH_TOKEN");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user