mirror of
https://github.com/grassrootseconomics/erc20-pool.git
synced 2024-11-21 19:56:48 +01:00
Add fee withdraw option
This commit is contained in:
parent
b5fbc778c0
commit
365c84d88b
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"},{"internalType":"address","name":"_tokenRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"SwapPool.sol":"SwapPool"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"SwapPool.sol":{"keccak256":"0xe353d1255baee8fd9937c51600b0710e041108f041062a0130e6833a51c5c873","license":"AGPL-3.0-or-later","urls":["bzz-raw://56811f458f4310e26fbe8cf177eff3165898f324bfe74a6ca954771d20f3b498","dweb:/ipfs/QmYa1bep3hAvcNr7w1PHjRa65CLUkcJKmZRftKXZGG8wwS"]}},"version":1}
|
{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"},{"internalType":"address","name":"_tokenRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"SwapPool.sol":"SwapPool"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"SwapPool.sol":{"keccak256":"0x954a98452d67b8c1587a76b94f57a0fb277678a92c40347662cbd36b7b34e245","license":"AGPL-3.0-or-later","urls":["bzz-raw://fe8853bf6e26769186afe48207c968b60c49dbb6fd3beefa0295a6e2284cb80c","dweb:/ipfs/QmW2wruSUAs1x1ufHYQudffBhpW2e5FEcEGBFhHPbg6HmN"]}},"version":1}
|
||||||
|
@ -116,4 +116,37 @@ class Pool(TxFactory):
|
|||||||
return tx
|
return tx
|
||||||
|
|
||||||
|
|
||||||
|
def set_fee_address(self, contract_address, sender_address, fee_address, tx_format=TxFormat.JSONRPC, id_generator=None):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('setFeeAddress')
|
||||||
|
enc.typ(ABIContractType.ADDRESS)
|
||||||
|
enc.address(fee_address)
|
||||||
|
data = add_0x(enc.get())
|
||||||
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
|
tx = self.set_code(tx, data)
|
||||||
|
tx = self.finalize(tx, tx_format, id_generator=id_generator)
|
||||||
|
return tx
|
||||||
|
|
||||||
|
|
||||||
|
def set_fee(self, contract_address, sender_address, fee, tx_format=TxFormat.JSONRPC, id_generator=None):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('setFee')
|
||||||
|
enc.typ(ABIContractType.UINT256)
|
||||||
|
enc.uint256(fee)
|
||||||
|
data = add_0x(enc.get())
|
||||||
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
|
tx = self.set_code(tx, data)
|
||||||
|
tx = self.finalize(tx, tx_format, id_generator=id_generator)
|
||||||
|
return tx
|
||||||
|
|
||||||
|
|
||||||
|
def withdraw(self, contract_address, sender_address, token_address, tx_format=TxFormat.JSONRPC, id_generator=None):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('withdraw')
|
||||||
|
enc.typ(ABIContractType.ADDRESS)
|
||||||
|
enc.address(token_address)
|
||||||
|
data = add_0x(enc.get())
|
||||||
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
|
tx = self.set_code(tx, data)
|
||||||
|
tx = self.finalize(tx, tx_format, id_generator=id_generator)
|
||||||
|
return tx
|
||||||
|
@ -41,13 +41,13 @@ class TestERC20Pool(TestGiftableToken):
|
|||||||
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
||||||
c = GiftableToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = GiftableToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.mint_to(self.bar_address, self.accounts[0], self.accounts[1], self.initial_supply_bar)
|
(tx_hash, o) = c.mint_to(self.bar_address, self.accounts[0], self.accounts[1], self.initial_supply_bar)
|
||||||
r = self.conn.do(o)
|
self.conn.do(o)
|
||||||
o = receipt(tx_hash)
|
o = receipt(tx_hash)
|
||||||
r = self.conn.do(o)
|
r = self.conn.do(o)
|
||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
(tx_hash, o) = c.mint_to(self.baz_address, self.accounts[0], self.accounts[2], self.initial_supply_baz)
|
(tx_hash, o) = c.mint_to(self.baz_address, self.accounts[0], self.accounts[2], self.initial_supply_baz)
|
||||||
r = self.conn.do(o)
|
self.conn.do(o)
|
||||||
o = receipt(tx_hash)
|
o = receipt(tx_hash)
|
||||||
r = self.conn.do(o)
|
r = self.conn.do(o)
|
||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
@ -58,6 +58,6 @@ class TestERC20Pool(TestGiftableToken):
|
|||||||
o = receipt(tx_hash)
|
o = receipt(tx_hash)
|
||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
self.voter_address = to_checksum_address(r['contract_address'])
|
self.pool_address = to_checksum_address(r['contract_address'])
|
||||||
logg.debug('published bar token {}, baz token {}'.format(self.bar_address, self.baz_address))
|
logg.debug('published bar token {}, baz token {}'.format(self.bar_address, self.baz_address))
|
||||||
logg.debug('published voter on address {} with hash {}'.format(self.voter_address, tx_hash))
|
logg.debug('published pool on address {} with hash {}'.format(self.pool_address, tx_hash))
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
eth-erc20~=0.7.3
|
eth-erc20~=0.7.5
|
||||||
chainlib-eth~=0.4.22
|
chainlib-eth~=0.4.22
|
||||||
#chainlib~=0.4.14
|
#chainlib~=0.4.14
|
||||||
|
14
python/run_tests.sh
Normal file
14
python/run_tests.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -a
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
default_pythonpath=$PYTHONPATH:.
|
||||||
|
export PYTHONPATH=${default_pythonpath:-.}
|
||||||
|
>&2 echo using pythonpath $PYTHONPATH
|
||||||
|
for f in `ls tests/*.py`; do
|
||||||
|
python $f
|
||||||
|
done
|
||||||
|
set +x
|
||||||
|
set +e
|
||||||
|
set +a
|
@ -25,18 +25,18 @@ class TestPoolBase(TestERC20Pool):
|
|||||||
def test_deposit(self):
|
def test_deposit(self):
|
||||||
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
||||||
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.approve(self.foo_address, self.accounts[0], self.voter_address, 1024)
|
(tx_hash, o) = c.approve(self.foo_address, self.accounts[0], self.pool_address, 1024)
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
|
|
||||||
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.deposit(self.voter_address, self.accounts[0], self.foo_address, 1024)
|
(tx_hash, o) = c.deposit(self.pool_address, self.accounts[0], self.foo_address, 1024)
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
o = receipt(tx_hash)
|
o = receipt(tx_hash)
|
||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
o = c.balance_of(self.foo_address, self.voter_address, sender_address=self.accounts[0])
|
o = c.balance_of(self.foo_address, self.pool_address, sender_address=self.accounts[0])
|
||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
self.assertEqual(int(r, 16), 1024)
|
self.assertEqual(int(r, 16), 1024)
|
||||||
|
|
||||||
@ -44,24 +44,20 @@ class TestPoolBase(TestERC20Pool):
|
|||||||
def test_swap(self):
|
def test_swap(self):
|
||||||
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
||||||
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.approve(self.foo_address, self.accounts[0], self.voter_address, 1024)
|
(tx_hash, o) = c.approve(self.foo_address, self.accounts[0], self.pool_address, 1024)
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
|
|
||||||
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.deposit(self.voter_address, self.accounts[0], self.foo_address, 1024)
|
(tx_hash, o) = c.deposit(self.pool_address, self.accounts[0], self.foo_address, 1024)
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
|
|
||||||
nonce_oracle = RPCNonceOracle(self.accounts[1], conn=self.conn)
|
nonce_oracle = RPCNonceOracle(self.accounts[1], conn=self.conn)
|
||||||
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.approve(self.bar_address, self.accounts[1], self.voter_address, 768)
|
(tx_hash, o) = c.approve(self.bar_address, self.accounts[1], self.pool_address, 768)
|
||||||
self.rpc.do(o)
|
|
||||||
|
|
||||||
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
|
||||||
(tx_hash, o) = c.approve(self.foo_address, self.accounts[1], self.voter_address, 768)
|
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
|
|
||||||
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
(tx_hash, o) = c.swap(self.voter_address, self.accounts[1], self.foo_address, self.bar_address, 768)
|
(tx_hash, o) = c.swap(self.pool_address, self.accounts[1], self.foo_address, self.bar_address, 768)
|
||||||
self.rpc.do(o)
|
self.rpc.do(o)
|
||||||
o = receipt(tx_hash)
|
o = receipt(tx_hash)
|
||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
|
78
python/tests/test_fee.py
Normal file
78
python/tests/test_fee.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# standard imports
|
||||||
|
import unittest
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
from chainlib.eth.nonce import RPCNonceOracle
|
||||||
|
from chainlib.eth.tx import receipt
|
||||||
|
from chainlib.eth.block import block_latest
|
||||||
|
from hexathon import same as same_hex
|
||||||
|
from eth_erc20 import ERC20
|
||||||
|
from giftable_erc20_token import GiftableToken
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from erc20_pool.unittest import TestERC20Pool
|
||||||
|
from erc20_pool import Pool
|
||||||
|
#from evm_tokenvote.unittest.base import hash_of_foo
|
||||||
|
#from evm_tokenvote import Voter
|
||||||
|
#from evm_tokenvote import ProposalState
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
class TestPoolBase(TestERC20Pool):
|
||||||
|
|
||||||
|
def test_swap_fee(self):
|
||||||
|
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
||||||
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.set_fee_address(self.pool_address, self.accounts[0], self.accounts[9])
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.conn.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.set_fee(self.pool_address, self.accounts[0], 10000)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.conn.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn)
|
||||||
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.approve(self.foo_address, self.accounts[0], self.pool_address, 1000)
|
||||||
|
self.rpc.do(o)
|
||||||
|
|
||||||
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.deposit(self.pool_address, self.accounts[0], self.foo_address, 1000)
|
||||||
|
self.rpc.do(o)
|
||||||
|
|
||||||
|
nonce_oracle = RPCNonceOracle(self.accounts[1], conn=self.conn)
|
||||||
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.approve(self.bar_address, self.accounts[1], self.pool_address, 1000)
|
||||||
|
self.rpc.do(o)
|
||||||
|
|
||||||
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.swap(self.pool_address, self.accounts[1], self.foo_address, self.bar_address, 1000)
|
||||||
|
self.rpc.do(o)
|
||||||
|
|
||||||
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
o = c.balance_of(self.foo_address, self.accounts[1], sender_address=self.accounts[0])
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(int(r, 16), 990)
|
||||||
|
|
||||||
|
nonce_oracle = RPCNonceOracle(self.accounts[2], conn=self.conn)
|
||||||
|
c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.withdraw(self.pool_address, self.accounts[2], self.foo_address)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.conn.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
o = c.balance_of(self.foo_address, self.accounts[9], sender_address=self.accounts[0])
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(int(r, 16), 10)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
@ -41,6 +41,7 @@ contract SwapPool {
|
|||||||
decimals = _decimals;
|
decimals = _decimals;
|
||||||
registry = _tokenRegistry;
|
registry = _tokenRegistry;
|
||||||
declaration = _declaration;
|
declaration = _declaration;
|
||||||
|
owner = msg.sender;
|
||||||
}
|
}
|
||||||
|
|
||||||
function seal(uint256 _state) public returns(uint256) {
|
function seal(uint256 _state) public returns(uint256) {
|
||||||
@ -157,6 +158,7 @@ contract SwapPool {
|
|||||||
uint256 balance;
|
uint256 balance;
|
||||||
|
|
||||||
balance = fees[_outToken];
|
balance = fees[_outToken];
|
||||||
|
fees[_outToken] = 0;
|
||||||
|
|
||||||
return withdraw(_outToken, balance);
|
return withdraw(_outToken, balance);
|
||||||
}
|
}
|
||||||
@ -167,7 +169,7 @@ contract SwapPool {
|
|||||||
|
|
||||||
require(feeAddress != address(0), "ERR_AXX");
|
require(feeAddress != address(0), "ERR_AXX");
|
||||||
|
|
||||||
(r, v) = _outToken.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', this, feeAddress, _value));
|
(r, v) = _outToken.call(abi.encodeWithSignature('transfer(address,uint256)', feeAddress, _value));
|
||||||
require(r, "ERR_TOKEN");
|
require(r, "ERR_TOKEN");
|
||||||
r = abi.decode(v, (bool));
|
r = abi.decode(v, (bool));
|
||||||
require(r, "ERR_TRANSFER");
|
require(r, "ERR_TRANSFER");
|
||||||
|
Loading…
Reference in New Issue
Block a user