mirror of
https://github.com/chaintool-py/eth-erc20.git
synced 2026-04-24 19:57:15 +02:00
Compare commits
9 Commits
lash/trans
...
v0.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78e3637289
|
||
|
|
aec45d7f09
|
||
|
|
48156eb7ba
|
||
|
|
70663293af
|
||
|
|
8f8d96dfef
|
||
|
|
1ed9da5a42
|
||
|
|
aed92e96d3
|
||
|
|
cda642253b | ||
|
|
d5a48282be
|
@@ -1,3 +1,7 @@
|
|||||||
|
* 0.3.2
|
||||||
|
- Implement chainlib 0.3.0
|
||||||
|
* 0.3.1
|
||||||
|
- Upgrade chainlib to 0.2.0
|
||||||
* 0.1.10
|
* 0.1.10
|
||||||
- Apply transfer ownership protection in GiftableToken contract
|
- Apply transfer ownership protection in GiftableToken contract
|
||||||
* 0.1.9
|
* 0.1.9
|
||||||
|
|||||||
@@ -217,7 +217,6 @@ class ERC20(TxFactory):
|
|||||||
l = len(r)
|
l = len(r)
|
||||||
m = v[:l]
|
m = v[:l]
|
||||||
if m != r:
|
if m != r:
|
||||||
logg.error('method mismatch, expected {}, got {}'.format(r, m))
|
|
||||||
raise RequestMismatchException(v)
|
raise RequestMismatchException(v)
|
||||||
cursor += l
|
cursor += l
|
||||||
|
|
||||||
@@ -244,7 +243,6 @@ class ERC20(TxFactory):
|
|||||||
l = len(r)
|
l = len(r)
|
||||||
m = v[:l]
|
m = v[:l]
|
||||||
if m != r:
|
if m != r:
|
||||||
logg.error('method mismatch, expected {}, got {}'.format(r, m))
|
|
||||||
raise RequestMismatchException(v)
|
raise RequestMismatchException(v)
|
||||||
cursor += l
|
cursor += l
|
||||||
|
|
||||||
@@ -273,7 +271,6 @@ class ERC20(TxFactory):
|
|||||||
l = len(r)
|
l = len(r)
|
||||||
m = v[:l]
|
m = v[:l]
|
||||||
if m != r:
|
if m != r:
|
||||||
logg.error('method mismatch, expected {}, got {}'.format(r, m))
|
|
||||||
raise RequestMismatchException(v)
|
raise RequestMismatchException(v)
|
||||||
cursor += l
|
cursor += l
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,15 @@ import sha3
|
|||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
import chainlib.eth.cli
|
import chainlib.eth.cli
|
||||||
|
from chainlib.eth.cli.arg import (
|
||||||
|
Arg,
|
||||||
|
ArgFlag,
|
||||||
|
process_args,
|
||||||
|
)
|
||||||
|
from chainlib.eth.cli.config import (
|
||||||
|
Config,
|
||||||
|
process_config,
|
||||||
|
)
|
||||||
from chainlib.eth.address import to_checksum_address
|
from chainlib.eth.address import to_checksum_address
|
||||||
from chainlib.eth.connection import EthHTTPConnection
|
from chainlib.eth.connection import EthHTTPConnection
|
||||||
from chainlib.eth.gas import (
|
from chainlib.eth.gas import (
|
||||||
@@ -33,35 +42,49 @@ from chainlib.eth.gas import (
|
|||||||
balance,
|
balance,
|
||||||
)
|
)
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
|
from chainlib.eth.cli.log import process_log
|
||||||
|
from chainlib.eth.settings import process_settings
|
||||||
|
from chainlib.settings import ChainSettings
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from eth_erc20 import ERC20
|
from eth_erc20 import ERC20
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
|
||||||
|
def process_config_local(config, arg, args, flags):
|
||||||
|
config.add(args.address, '_RECIPIENT', False)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
arg_flags = chainlib.eth.cli.argflag_std_read | chainlib.eth.cli.Flag.EXEC
|
arg_flags = ArgFlag()
|
||||||
argparser = chainlib.eth.cli.ArgumentParser(arg_flags)
|
arg = Arg(arg_flags)
|
||||||
argparser.add_positional('address', type=str, help='Ethereum address of recipient')
|
flags = arg_flags.STD_READ | arg_flags.EXEC
|
||||||
|
|
||||||
|
argparser = chainlib.eth.cli.ArgumentParser()
|
||||||
|
argparser = process_args(argparser, arg, flags)
|
||||||
|
argparser.add_argument('address', type=str, help='Ethereum address of recipient')
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
config = chainlib.eth.cli.Config.from_args(args, arg_flags)
|
|
||||||
|
|
||||||
wallet = chainlib.eth.cli.Wallet()
|
logg = process_log(args, logg)
|
||||||
wallet.from_config(config)
|
|
||||||
holder_address = args.address
|
|
||||||
if wallet.get_signer_address() == None and holder_address != None:
|
|
||||||
holder_address = wallet.from_address(holder_address)
|
|
||||||
|
|
||||||
rpc = chainlib.eth.cli.Rpc()
|
config = Config()
|
||||||
conn = rpc.connect_by_config(config)
|
config = process_config(config, arg, args, flags)
|
||||||
|
config = process_config_local(config, arg, args, flags)
|
||||||
|
logg.debug('config loaded:\n{}'.format(config))
|
||||||
|
|
||||||
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
settings = ChainSettings()
|
||||||
|
settings = process_settings(settings, config)
|
||||||
token_address = config.get('_EXEC_ADDRESS')
|
logg.debug('settings loaded:\n{}'.format(settings))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
g = ERC20(chain_spec=chain_spec, gas_oracle=rpc.get_gas_oracle())
|
token_address = settings.get('EXEC')
|
||||||
|
conn = settings.get('CONN')
|
||||||
|
g = ERC20(
|
||||||
|
chain_spec=settings.get('CHAIN_SPEC'),
|
||||||
|
gas_oracle=settings.get('GAS_ORACLE'),
|
||||||
|
)
|
||||||
|
|
||||||
# determine decimals
|
# determine decimals
|
||||||
decimals_o = g.decimals(token_address)
|
decimals_o = g.decimals(token_address)
|
||||||
@@ -80,7 +103,7 @@ def main():
|
|||||||
logg.info('symbol {}'.format(token_symbol))
|
logg.info('symbol {}'.format(token_symbol))
|
||||||
|
|
||||||
# get balance
|
# get balance
|
||||||
balance_o = g.balance(token_address, holder_address)
|
balance_o = g.balance(token_address, settings.get('RECIPIENT'))
|
||||||
r = conn.do(balance_o)
|
r = conn.do(balance_o)
|
||||||
|
|
||||||
hx = strip_0x(r)
|
hx = strip_0x(r)
|
||||||
|
|||||||
@@ -26,6 +26,15 @@ import sha3
|
|||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
import chainlib.eth.cli
|
import chainlib.eth.cli
|
||||||
|
from chainlib.eth.cli.arg import (
|
||||||
|
Arg,
|
||||||
|
ArgFlag,
|
||||||
|
process_args,
|
||||||
|
)
|
||||||
|
from chainlib.eth.cli.config import (
|
||||||
|
Config,
|
||||||
|
process_config,
|
||||||
|
)
|
||||||
from chainlib.eth.address import to_checksum_address
|
from chainlib.eth.address import to_checksum_address
|
||||||
from chainlib.eth.connection import EthHTTPConnection
|
from chainlib.eth.connection import EthHTTPConnection
|
||||||
from chainlib.eth.gas import (
|
from chainlib.eth.gas import (
|
||||||
@@ -33,76 +42,98 @@ from chainlib.eth.gas import (
|
|||||||
balance,
|
balance,
|
||||||
)
|
)
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
|
from chainlib.eth.settings import process_settings
|
||||||
|
from chainlib.settings import ChainSettings
|
||||||
|
from chainlib.eth.cli.log import process_log
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from eth_erc20 import ERC20
|
from eth_erc20 import ERC20
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
arg_flags = chainlib.eth.cli.argflag_std_read | chainlib.eth.cli.Flag.EXEC
|
|
||||||
argparser = chainlib.eth.cli.ArgumentParser(arg_flags)
|
def process_config_local(config, arg, args, flags):
|
||||||
argparser.add_positional('item', required=False)
|
config.add(args.item, '_ITEM', False)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
arg_flags = ArgFlag()
|
||||||
|
arg = Arg(arg_flags)
|
||||||
|
flags = arg_flags.STD_READ | arg_flags.EXEC
|
||||||
|
|
||||||
|
argparser = chainlib.eth.cli.ArgumentParser()
|
||||||
|
argparser = process_args(argparser, arg, flags)
|
||||||
|
argparser.add_argument('item', type=str, nargs='?', help='display only given data item')
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
config = chainlib.eth.cli.Config.from_args(args, arg_flags)
|
|
||||||
|
|
||||||
rpc = chainlib.eth.cli.Rpc()
|
logg = process_log(args, logg)
|
||||||
conn = rpc.connect_by_config(config)
|
|
||||||
|
|
||||||
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
config = Config()
|
||||||
|
config = process_config(config, arg, args, flags)
|
||||||
|
config = process_config_local(config, arg, args, flags)
|
||||||
|
logg.debug('config loaded:\n{}'.format(config))
|
||||||
|
|
||||||
token_address = config.get('_EXEC_ADDRESS')
|
settings = ChainSettings()
|
||||||
|
settings = process_settings(settings, config)
|
||||||
|
logg.debug('settings loaded:\n{}'.format(settings))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
g = ERC20(chain_spec=chain_spec, gas_oracle=rpc.get_gas_oracle())
|
token_address = settings.get('EXEC')
|
||||||
|
item = config.get('_ITEM')
|
||||||
|
conn = settings.get('CONN')
|
||||||
|
g = ERC20(
|
||||||
|
chain_spec=settings.get('CHAIN_SPEC'),
|
||||||
|
gas_oracle=settings.get('GAS_ORACLE'),
|
||||||
|
)
|
||||||
|
|
||||||
if not args.item or args.item == 'name':
|
|
||||||
|
if not item or item == 'name':
|
||||||
name_o = g.name(token_address)
|
name_o = g.name(token_address)
|
||||||
r = conn.do(name_o)
|
r = conn.do(name_o)
|
||||||
token_name = g.parse_name(r)
|
token_name = g.parse_name(r)
|
||||||
s = ''
|
s = ''
|
||||||
if not args.item or not args.raw:
|
if not item or not args.raw:
|
||||||
s = 'Name: '
|
s = 'Name: '
|
||||||
s += token_name
|
s += token_name
|
||||||
print(s)
|
print(s)
|
||||||
if args.item == 'name':
|
if item == 'name':
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
if not args.item or args.item == 'symbol':
|
if not item or item == 'symbol':
|
||||||
symbol_o = g.symbol(token_address)
|
symbol_o = g.symbol(token_address)
|
||||||
r = conn.do(symbol_o)
|
r = conn.do(symbol_o)
|
||||||
token_symbol = g.parse_symbol(r)
|
token_symbol = g.parse_symbol(r)
|
||||||
s = ''
|
s = ''
|
||||||
if not args.item or not args.raw:
|
if not item or not args.raw:
|
||||||
s = 'Symbol: '
|
s = 'Symbol: '
|
||||||
s += token_symbol
|
s += token_symbol
|
||||||
print(s)
|
print(s)
|
||||||
if args.item == 'symbol':
|
if item == 'symbol':
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
if not args.item or args.item == 'decimals':
|
if not item or item == 'decimals':
|
||||||
decimals_o = g.decimals(token_address)
|
decimals_o = g.decimals(token_address)
|
||||||
r = conn.do(decimals_o)
|
r = conn.do(decimals_o)
|
||||||
decimals = int(strip_0x(r), 16)
|
decimals = int(strip_0x(r), 16)
|
||||||
s = ''
|
s = ''
|
||||||
if not args.item or not args.raw:
|
if not item or not args.raw:
|
||||||
s = 'Decimals: '
|
s = 'Decimals: '
|
||||||
s += str(decimals)
|
s += str(decimals)
|
||||||
print(s)
|
print(s)
|
||||||
if args.item == 'decimals':
|
if item == 'decimals':
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
if not args.item or args.item == 'supply':
|
if not item or item == 'supply':
|
||||||
supply_o = g.total_supply(token_address)
|
supply_o = g.total_supply(token_address)
|
||||||
r = conn.do(supply_o)
|
r = conn.do(supply_o)
|
||||||
supply = int(strip_0x(r), 16)
|
supply = int(strip_0x(r), 16)
|
||||||
s = ''
|
s = ''
|
||||||
if not args.item or not args.raw:
|
if not item or not args.raw:
|
||||||
s = 'Supply: '
|
s = 'Supply: '
|
||||||
s += str(supply)
|
s += str(supply)
|
||||||
print(s)
|
print(s)
|
||||||
if args.item == 'supply':
|
if item == 'supply':
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,39 +26,52 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainlib.eth.runnable.util import decode_for_puny_humans
|
from chainlib.eth.runnable.util import decode_for_puny_humans
|
||||||
from chainlib.eth.address import to_checksum_address
|
from chainlib.eth.address import to_checksum_address
|
||||||
import chainlib.eth.cli
|
import chainlib.eth.cli
|
||||||
|
from chainlib.eth.cli.log import process_log
|
||||||
|
from chainlib.eth.settings import process_settings
|
||||||
|
from chainlib.settings import ChainSettings
|
||||||
|
from chainlib.eth.cli.arg import (
|
||||||
|
Arg,
|
||||||
|
ArgFlag,
|
||||||
|
process_args,
|
||||||
|
)
|
||||||
|
from chainlib.eth.cli.config import (
|
||||||
|
Config,
|
||||||
|
process_config,
|
||||||
|
)
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from eth_erc20 import ERC20
|
from eth_erc20 import ERC20
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC | chainlib.eth.cli.Flag.WALLET
|
|
||||||
argparser = chainlib.eth.cli.ArgumentParser(arg_flags)
|
def process_config_local(config, arg, args, flags):
|
||||||
argparser.add_positional('amount', type=int, help='Token amount to send')
|
config.add(args.amount, '_VALUE', False)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
arg_flags = ArgFlag()
|
||||||
|
arg = Arg(arg_flags)
|
||||||
|
flags = arg_flags.STD_WRITE | arg_flags.EXEC | arg_flags.WALLET
|
||||||
|
|
||||||
|
argparser = chainlib.eth.cli.ArgumentParser()
|
||||||
|
argparser = process_args(argparser, arg, flags)
|
||||||
|
argparser.add_argument('amount', type=str, help='Token amount to send')
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
extra_args = {
|
|
||||||
'amount': None,
|
|
||||||
}
|
|
||||||
config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=100000)
|
|
||||||
|
|
||||||
block_all = args.ww
|
logg = process_log(args, logg)
|
||||||
block_last = args.w or block_all
|
|
||||||
|
|
||||||
wallet = chainlib.eth.cli.Wallet()
|
config = Config()
|
||||||
wallet.from_config(config)
|
config = process_config(config, arg, args, flags)
|
||||||
|
config = process_config_local(config, arg, args, flags)
|
||||||
|
logg.debug('config loaded:\n{}'.format(config))
|
||||||
|
|
||||||
rpc = chainlib.eth.cli.Rpc(wallet=wallet)
|
settings = ChainSettings()
|
||||||
conn = rpc.connect_by_config(config)
|
settings = process_settings(settings, config)
|
||||||
|
logg.debug('settings loaded:\n{}'.format(settings))
|
||||||
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
|
||||||
|
|
||||||
value = config.get('_AMOUNT')
|
|
||||||
|
|
||||||
send = config.true('_RPC_SEND')
|
|
||||||
|
|
||||||
|
|
||||||
def balance(generator, token_address, address, id_generator=None):
|
def balance(conn, generator, token_address, address, id_generator=None):
|
||||||
o = generator.balance(token_address, address, id_generator=id_generator)
|
o = generator.balance(token_address, address, id_generator=id_generator)
|
||||||
r = conn.do(o)
|
r = conn.do(o)
|
||||||
token_balance = generator.parse_balance(r)
|
token_balance = generator.parse_balance(r)
|
||||||
@@ -66,37 +79,32 @@ def balance(generator, token_address, address, id_generator=None):
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
signer = rpc.get_signer()
|
token_address = settings.get('EXEC')
|
||||||
signer_address = rpc.get_sender_address()
|
signer_address = settings.get('SENDER_ADDRESS')
|
||||||
|
recipient = settings.get('RECIPIENT')
|
||||||
gas_oracle = rpc.get_gas_oracle()
|
value = settings.get('VALUE')
|
||||||
nonce_oracle = rpc.get_nonce_oracle()
|
conn = settings.get('CONN')
|
||||||
|
g = ERC20(
|
||||||
g = ERC20(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
settings.get('CHAIN_SPEC'),
|
||||||
|
signer=settings.get('SIGNER'),
|
||||||
recipient = to_checksum_address(config.get('_RECIPIENT'))
|
gas_oracle=settings.get('GAS_ORACLE'),
|
||||||
if not config.true('_UNSAFE') and recipient != add_0x(config.get('_RECIPIENT')):
|
nonce_oracle=settings.get('NONCE_ORACLE'),
|
||||||
raise ValueError('invalid checksum address for recipient')
|
)
|
||||||
|
|
||||||
token_address = to_checksum_address(config.get('_EXEC_ADDRESS'))
|
|
||||||
if not config.true('_UNSAFE') and token_address != add_0x(config.get('_EXEC_ADDRESS')):
|
|
||||||
raise ValueError('invalid checksum address for contract')
|
|
||||||
|
|
||||||
if logg.isEnabledFor(logging.DEBUG):
|
if logg.isEnabledFor(logging.DEBUG):
|
||||||
sender_balance = balance(g, token_address, signer_address, id_generator=rpc.id_generator)
|
sender_balance = balance(conn, g, token_address, signer_address, id_generator=settings.get('RPC_ID_GENERATOR'))
|
||||||
recipient_balance = balance(g, token_address, recipient, id_generator=rpc.id_generator)
|
recipient_balance = balance(conn, g, token_address, recipient, id_generator=settings.get('RPC_ID_GENERATOR'))
|
||||||
logg.debug('sender {} balance before: {}'.format(signer_address, sender_balance))
|
logg.debug('sender {} balance before: {}'.format(signer_address, sender_balance))
|
||||||
logg.debug('recipient {} balance before: {}'.format(recipient, recipient_balance))
|
logg.debug('recipient {} balance before: {}'.format(recipient, recipient_balance))
|
||||||
|
|
||||||
(tx_hash_hex, o) = g.transfer(token_address, signer_address, recipient, value, id_generator=rpc.id_generator)
|
(tx_hash_hex, o) = g.transfer(token_address, signer_address, recipient, value, id_generator=settings.get('RPC_ID_GENERATOR'))
|
||||||
|
|
||||||
if send:
|
if settings.get('RPC_SEND'):
|
||||||
conn.do(o)
|
conn.do(o)
|
||||||
if block_last:
|
if settings.get('WAIT'):
|
||||||
r = conn.wait(tx_hash_hex)
|
r = conn.wait(tx_hash_hex)
|
||||||
if logg.isEnabledFor(logging.DEBUG):
|
if logg.isEnabledFor(logging.DEBUG):
|
||||||
sender_balance = balance(g, token_address, signer_address, id_generator=rpc.id_generator)
|
sender_balance = balance(conn, g, token_address, signer_address, id_generator=settings.get('RPC_ID_GENERATOR'))
|
||||||
recipient_balance = balance(g, token_address, recipient, id_generator=rpc.id_generator)
|
recipient_balance = balance(conn, g, token_address, recipient, id_generator=settings.get('RPC_ID_GENERATOR'))
|
||||||
logg.debug('sender {} balance after: {}'.format(signer_address, sender_balance))
|
logg.debug('sender {} balance after: {}'.format(signer_address, sender_balance))
|
||||||
logg.debug('recipient {} balance after: {}'.format(recipient, recipient_balance))
|
logg.debug('recipient {} balance after: {}'.format(recipient, recipient_balance))
|
||||||
if r['status'] == 0:
|
if r['status'] == 0:
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -94,4 +94,6 @@ class GiftableToken(TxFactory):
|
|||||||
tx = self.template(sender_address, contract_address, use_nonce=True)
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
tx = self.set_code(tx, data)
|
tx = self.set_code(tx, data)
|
||||||
tx = self.finalize(tx, tx_format)
|
tx = self.finalize(tx, tx_format)
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
confini~=0.5.2
|
confini~=0.6.1
|
||||||
chainlib-eth~=0.0.14
|
chainlib-eth~=0.3.0
|
||||||
potaahto==0.1.0
|
potaahto~=0.1.1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
name = eth-erc20
|
name = eth-erc20
|
||||||
version = 0.1.10
|
version = 0.4.0
|
||||||
description = ERC20 interface and simple contract with deployment script that lets any address mint and gift itself tokens.
|
description = ERC20 interface and simple contract with deployment script that lets any address mint and gift itself tokens.
|
||||||
author = Louis Holbrook
|
author = Louis Holbrook
|
||||||
author_email = dev@holbrook.no
|
author_email = dev@holbrook.no
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user