Add token deployment
This commit is contained in:
parent
538b352cf7
commit
c2999f466a
@ -1 +1 @@
|
|||||||
include requirements.txt cic/data/* cic/schema/*
|
include *requirements.txt cic/data/* cic/schema/*
|
||||||
|
@ -4,8 +4,12 @@ import copy
|
|||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
from chainlib.eth.tx import TxFormat
|
from chainlib.eth.tx import (
|
||||||
|
TxFormat,
|
||||||
|
TxFactory,
|
||||||
|
)
|
||||||
from chainlib.eth.connection import RPCConnection
|
from chainlib.eth.connection import RPCConnection
|
||||||
|
from chainlib.eth.contract import ABIContractEncoder
|
||||||
from eth_token_index import TokenUniqueSymbolIndex
|
from eth_token_index import TokenUniqueSymbolIndex
|
||||||
from eth_address_declarator import Declarator
|
from eth_address_declarator import Declarator
|
||||||
|
|
||||||
@ -24,7 +28,9 @@ class CICEth:
|
|||||||
self.rpc = rpc
|
self.rpc = rpc
|
||||||
self.nonce_oracle = nonce_oracle
|
self.nonce_oracle = nonce_oracle
|
||||||
self.fee_oracle = fee_oracle
|
self.fee_oracle = fee_oracle
|
||||||
|
self.token_details = None
|
||||||
self.token_address = None
|
self.token_address = None
|
||||||
|
self.token_code = None
|
||||||
self.outputs = []
|
self.outputs = []
|
||||||
self.tx_format = TxFormat.RAW_ARGS
|
self.tx_format = TxFormat.RAW_ARGS
|
||||||
if self.rpc != None:
|
if self.rpc != None:
|
||||||
@ -33,10 +39,43 @@ class CICEth:
|
|||||||
self.tx_format = TxFormat.RLP_SIGNED
|
self.tx_format = TxFormat.RLP_SIGNED
|
||||||
|
|
||||||
|
|
||||||
def process_token(self):
|
def prepare_token(self, name, symbol, precision, code, extra={}, positions=None):
|
||||||
raise NotImplementedError
|
self.token_details = {
|
||||||
|
'name': name,
|
||||||
|
'symbol': symbol,
|
||||||
|
'precision': precision,
|
||||||
|
'code': code,
|
||||||
|
'extra': extra,
|
||||||
|
'positions': positions,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def process_token(self):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.string(self.token_details['name'])
|
||||||
|
enc.string(self.token_details['symbol'])
|
||||||
|
enc.uint256(self.token_details['precision'])
|
||||||
|
code = self.token_details['code'] + enc.get()
|
||||||
|
|
||||||
|
|
||||||
|
signer_address = self.resources['token']['key_address']
|
||||||
|
c = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=self.nonce_oracle, gas_oracle=self.fee_oracle)
|
||||||
|
tx = c.template(signer_address, None, use_nonce=True)
|
||||||
|
tx = c.set_code(tx, code)
|
||||||
|
o = c.finalize(tx, self.tx_format)
|
||||||
|
|
||||||
|
r = None
|
||||||
|
if self.rpc != None:
|
||||||
|
r = self.rpc.do(o[1])
|
||||||
|
elif self.signer != None:
|
||||||
|
r = o[1]
|
||||||
|
|
||||||
|
if r == None:
|
||||||
|
r = code
|
||||||
|
|
||||||
|
self.outputs.append(r)
|
||||||
|
return r
|
||||||
|
|
||||||
def process_token_index(self):
|
def process_token_index(self):
|
||||||
c = TokenUniqueSymbolIndex(self.chain_spec, signer=self.signer)
|
c = TokenUniqueSymbolIndex(self.chain_spec, signer=self.signer)
|
||||||
|
|
||||||
@ -79,7 +118,13 @@ class CICEth:
|
|||||||
self.token_address = self.resources['token']['reference']
|
self.token_address = self.resources['token']['reference']
|
||||||
if self.token_address == None:
|
if self.token_address == None:
|
||||||
tasks.append('token')
|
tasks.append('token')
|
||||||
tasks.append('token_index')
|
|
||||||
|
for k in self.resources.keys():
|
||||||
|
if k == 'token':
|
||||||
|
continue
|
||||||
|
if self.resources[k]['reference'] != None:
|
||||||
|
tasks.append(k)
|
||||||
|
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
getattr(self, 'process_̈́ ' + task)()
|
getattr(self, 'process_̈́ ' + task)()
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ include_package_data = True
|
|||||||
packages =
|
packages =
|
||||||
cic
|
cic
|
||||||
cic.runnable
|
cic.runnable
|
||||||
cic.ext
|
cic.ext.eth
|
||||||
|
|
||||||
[options.extras_require]
|
[options.extras_require]
|
||||||
eth = chainlib-eth~=0.0.9rc
|
eth = chainlib-eth~=0.0.9rc
|
||||||
|
4
test_requirements.txt
Normal file
4
test_requirements.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
erc20>=0.1.2a3,<0.2.0
|
||||||
|
eth_tester==0.5.0b3
|
||||||
|
py-evm==0.3.0a20
|
||||||
|
rlp==2.0.1
|
5
tests/base_cic.py
Normal file
5
tests/base_cic.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
|
||||||
|
test_base_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
test_data_dir = os.path.join(test_base_dir, 'testdata')
|
@ -28,5 +28,6 @@ class TestCICEthOffline(TestCICEthBase):
|
|||||||
self.assertEqual(len(v), 3)
|
self.assertEqual(len(v), 3)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
56
tests/eth/test_eth_token.py
Normal file
56
tests/eth/test_eth_token.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
from chainlib.eth.tx import (
|
||||||
|
TxFormat,
|
||||||
|
receipt,
|
||||||
|
)
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from cic.ext.eth import CICEth
|
||||||
|
|
||||||
|
# tests imports
|
||||||
|
from tests.eth.base_eth import TestCICEthBase
|
||||||
|
from tests.base_cic import test_data_dir
|
||||||
|
from giftable_erc20_token import GiftableToken
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
class TestCICEthToken(TestCICEthBase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestCICEthToken, self).setUp()
|
||||||
|
self.resources['token']['reference'] = None
|
||||||
|
self.adapter = CICEth(self.chain_spec, self.resources, self.proofs)
|
||||||
|
|
||||||
|
|
||||||
|
def test_token_nobackend(self):
|
||||||
|
self.adapter.prepare_token('FOoToken', 'FOO', 8, GiftableToken.bytecode())
|
||||||
|
v = self.adapter.process_token()
|
||||||
|
|
||||||
|
|
||||||
|
def test_token_sign(self):
|
||||||
|
self.adapter.signer = self.signer
|
||||||
|
self.adapter.tx_format = TxFormat.RLP_SIGNED
|
||||||
|
self.adapter.prepare_token('FOoToken', 'FOO', 8, GiftableToken.bytecode())
|
||||||
|
v = self.adapter.process_token()
|
||||||
|
|
||||||
|
|
||||||
|
def test_token_rpc(self):
|
||||||
|
self.adapter.signer = self.signer
|
||||||
|
self.adapter.rpc = self.rpc
|
||||||
|
self.adapter.tx_format = TxFormat.JSONRPC
|
||||||
|
self.adapter.prepare_token('FOoToken', 'FOO', 8, GiftableToken.bytecode())
|
||||||
|
v = self.adapter.process_token()
|
||||||
|
o = receipt(v)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
@ -9,10 +9,12 @@ from funga.eth.keystore.dict import DictKeystore
|
|||||||
from funga.error import DecryptError
|
from funga.error import DecryptError
|
||||||
from hexathon import uniform as hex_uniform
|
from hexathon import uniform as hex_uniform
|
||||||
|
|
||||||
|
# test imports
|
||||||
|
from tests.base_cic import test_base_dir
|
||||||
|
|
||||||
logging = logging.getLogger()
|
logging = logging.getLogger()
|
||||||
|
|
||||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
script_dir = test_base_dir
|
||||||
|
|
||||||
|
|
||||||
def pass_getter():
|
def pass_getter():
|
||||||
return 'test'
|
return 'test'
|
||||||
|
Loading…
Reference in New Issue
Block a user