예제 #1
0
    def test_transaction_is_valid_complete_test_passes(self):
        w = Wallet()

        tx = build_transaction(wallet=w,
                               processor='b' * 64,
                               stamps=123,
                               nonce=0,
                               contract='currency',
                               function='transfer',
                               kwargs={
                                   'amount': 123,
                                   'to': 'jeff'
                               })

        decoded = decode(tx)

        client = ContractingClient()
        client.flush()

        client.set_var(contract='currency',
                       variable='balances',
                       arguments=[w.verifying_key],
                       value=1_000_000)

        client.set_var(contract='stamp_cost',
                       variable='S',
                       arguments=['value'],
                       value=20_000)

        transaction.transaction_is_valid(transaction=decoded,
                                         expected_processor='b' * 64,
                                         client=client,
                                         nonces=self.driver)
예제 #2
0
    def add_to_balance(vk, amount, client: ContractingClient):
        current_balance = client.get_var(contract='currency',
                                         variable='balances',
                                         arguments=[vk],
                                         mark=False)

        if current_balance is None:
            current_balance = ContractingDecimal(0)

        amount = ContractingDecimal(amount)

        client.set_var(contract='currency',
                       variable='balances',
                       arguments=[vk],
                       value=amount + current_balance,
                       mark=True)
예제 #3
0
class TestRewards(TestCase):
    def setUp(self):
        self.client = ContractingClient()
        self.rewards = rewards.RewardManager()

    def tearDown(self):
        self.client.flush()

    def sync(self):
        sync.setup_genesis_contracts(['stu', 'raghu', 'steve'],
                                     ['tejas', 'alex2'],
                                     client=self.client)

    def test_contract_exists_false_before_sync(self):
        self.assertFalse(
            self.rewards.contract_exists('stamp_cost', self.client))

    def test_contract_exists_true_after_sync(self):
        # Sync contracts
        self.sync()
        self.assertTrue(self.rewards.contract_exists('stamp_cost',
                                                     self.client))

    def test_is_setup_false_before_sync(self):
        self.assertFalse(self.rewards.is_setup(self.client))

    def test_is_setup_true_after_sync(self):
        self.sync()
        self.assertTrue(self.rewards.is_setup(self.client))

    def test_add_to_balance_if_none_sets(self):
        self.rewards.add_to_balance('stu', 123, self.client)
        bal = self.client.get_var('currency',
                                  variable='balances',
                                  arguments=['stu'])
        self.assertEqual(bal, 123)

    def test_add_to_balance_twice_sets_accordingly(self):
        self.rewards.add_to_balance('stu', 123, self.client)
        bal = self.client.get_var('currency',
                                  variable='balances',
                                  arguments=['stu'])
        self.assertEqual(bal, 123)

        self.rewards.add_to_balance('stu', 123, self.client)
        bal = self.client.get_var('currency',
                                  variable='balances',
                                  arguments=['stu'])
        self.assertEqual(bal, 246)

    def test_calculate_rewards_returns_accurate_amounts_per_participant_group(
            self):
        self.sync()
        self.client.set_var(contract='rewards',
                            variable='S',
                            arguments=['value'],
                            value=[0.4, 0.3, 0.1, 0.1, 0.1])

        m, d, f, mapping = self.rewards.calculate_all_rewards(
            client=self.client, block=BLOCK)

        reconstructed = (m * 3) + (d * 2) + (f * 1) + (f * 1) + (f * 1)

        self.assertAlmostEqual(reconstructed,
                               self.rewards.stamps_in_block(BLOCK))

    def test_calculate_participant_reward_shaves_off_dust(self):
        rounded_reward = self.rewards.calculate_participant_reward(
            participant_ratio=1,
            number_of_participants=1,
            total_stamps_to_split=1.0000000000001)

        self.assertEqual(rounded_reward, 1)

    def test_distribute_rewards_adds_to_all_wallets(self):
        self.sync()
        self.client.set_var(contract='rewards',
                            variable='S',
                            arguments=['value'],
                            value=[0.4, 0.3, 0.1, 0.1, 0.1])
        self.client.set_var(contract='foundation',
                            variable='owner',
                            value='xxx')

        self.client.set_var(contract='stamp_cost',
                            variable='S',
                            arguments=['value'],
                            value=100)

        self.client.set_var(contract='thing_1',
                            variable='__developer__',
                            value='stu2')

        self.client.set_var(contract='thing_2',
                            variable='__developer__',
                            value='jeff')

        self.client.set_var(contract='thing_3',
                            variable='__developer__',
                            value='alex')

        total_tau_to_split = 4900

        m, d, f, mapping = self.rewards.calculate_all_rewards(
            client=self.client, block=BLOCK)

        self.rewards.distribute_rewards(m, d, f, mapping, client=self.client)

        masters = self.client.get_var(contract='masternodes',
                                      variable='S',
                                      arguments=['members'])
        delegates = self.client.get_var(contract='delegates',
                                        variable='S',
                                        arguments=['members'])

        for mn in masters:
            current_balance = self.client.get_var(contract='currency',
                                                  variable='balances',
                                                  arguments=[mn],
                                                  mark=False)
            self.assertEqual(current_balance, m / 100)

        for dl in delegates:
            current_balance = self.client.get_var(contract='currency',
                                                  variable='balances',
                                                  arguments=[dl],
                                                  mark=False)
            self.assertEqual(current_balance, d / 100)

        current_balance = self.client.get_var(contract='currency',
                                              variable='balances',
                                              arguments=['xxx'],
                                              mark=False)
        self.assertEqual(current_balance, f / 100)

    def test_stamps_in_block(self):
        block = {
            'number':
            2,
            'subblocks': [{
                'transactions': [{
                    'stamps_used': 1000
                }, {
                    'stamps_used': 2000
                }, {
                    'stamps_used': 3000
                }]
            }, {
                'transactions': [{
                    'stamps_used': 4500
                }, {
                    'stamps_used': 1250
                }, {
                    'stamps_used': 2750
                }]
            }]
        }

        self.assertEqual(self.rewards.stamps_in_block(block), 14500)

    def test_issue_rewards_full_loop_works(self):
        self.sync()
        self.client.set_var(contract='rewards',
                            variable='S',
                            arguments=['value'],
                            value=[0.4, 0.3, 0.1, 0.1, 0.1])
        self.client.set_var(contract='foundation',
                            variable='owner',
                            value='xxx')
        self.client.set_var(contract='stamp_cost',
                            variable='S',
                            arguments=['value'],
                            value=100)

        self.client.set_var(contract='thing_1',
                            variable='__developer__',
                            value='stu2')

        self.client.set_var(contract='thing_2',
                            variable='__developer__',
                            value='jeff')

        self.client.set_var(contract='thing_3',
                            variable='__developer__',
                            value='alex')

        block = {
            'number':
            1,
            'subblocks': [{
                'transactions': [{
                    'stamps_used': 1000,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_1'
                        }
                    }
                }, {
                    'stamps_used': 2000,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_2'
                        }
                    }
                }, {
                    'stamps_used': 3000,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_3'
                        }
                    }
                }]
            }, {
                'transactions': [{
                    'stamps_used': 4500,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_1'
                        }
                    }
                }, {
                    'stamps_used': 1250,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_1'
                        }
                    }
                }, {
                    'stamps_used': 2750,
                    'transaction': {
                        'payload': {
                            'contract': 'thing_2'
                        }
                    }
                }]
            }]
        }

        # tau to distribute should be 145

        stamps = self.rewards.stamps_in_block(block)

        tau = stamps / 100

        self.assertEqual(tau, 145)

        self.rewards.issue_rewards(block, client=self.client)

        # Stu is owed: 6750 stamps / 100 / 3 =
        # Jeff is owed: 4750 stamps / 100 / 3= 47.5
        # Alex is owed:

        m, d, f, mapping = self.rewards.calculate_all_rewards(
            client=self.client, block=block)

        masters = self.client.get_var(contract='masternodes',
                                      variable='S',
                                      arguments=['members'])
        delegates = self.client.get_var(contract='delegates',
                                        variable='S',
                                        arguments=['members'])

        for mn in masters:
            current_balance = self.client.get_var(contract='currency',
                                                  variable='balances',
                                                  arguments=[mn],
                                                  mark=False)
            self.assertEqual(current_balance, m / 100)

        for dl in delegates:
            current_balance = self.client.get_var(contract='currency',
                                                  variable='balances',
                                                  arguments=[dl],
                                                  mark=False)
            self.assertEqual(current_balance, d / 100)

        current_balance = self.client.get_var(contract='currency',
                                              variable='balances',
                                              arguments=['xxx'],
                                              mark=False)
        self.assertEqual(current_balance, f / 100)

        for dev in mapping.keys():
            current_balance = self.client.get_var(contract='currency',
                                                  variable='balances',
                                                  arguments=[dev],
                                                  mark=False)

            self.assertAlmostEqual(current_balance, mapping[dev] / 100)
예제 #4
0
class TestMiscContracts(TestCase):
    def setUp(self):
        self.c = ContractingClient(signer='stu')
        self.c.raw_driver.flush()

        with open('../../contracting/contracts/submission.s.py') as f:
            contract = f.read()

        self.c.raw_driver.set_contract(name='submission', code=contract,)

        self.c.raw_driver.commit()

        submission = self.c.get_contract('submission')

        self.c.submit(too_many_writes)

        # submit erc20 clone
        with open('./test_contracts/thing.s.py') as f:
            code = f.read()
            self.c.submit(code, name='thing')

        with open('./test_contracts/foreign_thing.s.py') as f:
            code = f.read()
            self.c.submit(code, name='foreign_thing')

        self.thing = self.c.get_contract('thing')
        self.foreign_thing = self.c.get_contract('foreign_thing')

    def tearDown(self):
        self.c.flush()

    def test_H_values_return(self):
        output = self.foreign_thing.read_H_hello()
        self.assertEqual(output, 'there')

        output = self.foreign_thing.read_H_something()
        self.assertEqual(output, 'else')

    def test_cant_modify_H(self):
        with self.assertRaises(ReferenceError):
            self.foreign_thing.set_H(k='hello', v='not_there')

    def test_cant_add_H(self):
        with self.assertRaises(ReferenceError):
            self.foreign_thing.set_H(k='asdf', v='123')

    def test_cant_set_V(self):
        with self.assertRaises(ReferenceError):
            self.foreign_thing.set_V(v=123)

    def test_V_returns(self):
        output = self.foreign_thing.read_V()
        self.assertEqual(output, 'hi')

    def test_single_too_many_writes_fails(self):
        tmwc = self.c.get_contract('too_many_writes')
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            tmwc.single()
        self.c.executor.metering = False

    def test_multiple_too_many_writes_fails(self):
        tmwc = self.c.get_contract('too_many_writes')
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            tmwc.multiple()
        self.c.executor.metering = False

    def test_failed_once_doesnt_affect_others(self):
        tmwc = self.c.get_contract('too_many_writes')
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            tmwc.multiple()
        tmwc.not_enough()
        self.c.executor.metering = False

    def test_memory_overload(self):
        tmwc = self.c.get_contract('too_many_writes')
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            tmwc.run()
        self.c.executor.metering = False

    def test_memory_overload2(self):
        tmwc = self.c.get_contract('too_many_writes')
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            tmwc.run2()
        self.c.executor.metering = False

    def test_memory_exploit(self):
        self.c.executor.metering = True
        self.c.set_var(contract='currency', variable='balances', arguments=['stu'], value=1000000)
        with self.assertRaises(AssertionError):
            self.c.submit(exploit)
        self.c.executor.metering = False