def test_retire_fail_ggo_other_settlement(self): set_add_1 = generate_address(AddressPrefix.SETTLEMENT, self.mea_con_1_key.PublicKey()) set_add_2 = generate_address(AddressPrefix.SETTLEMENT, self.mea_con_2_key.PublicKey()) context = MockContext(states={ self.ggo_1_add: self.ggo_1, self.mea_con_1_add: self.mea_con_1 }) transaction_retire = self.create_fake_transaction( payload=class_schema(RetireGGORequest)().dumps( RetireGGORequest(origin=self.ggo_1_add, settlement_address=set_add_2)).encode('utf8'), signer_key=self.ggo_1_key) transaction_settlement = self.create_fake_transaction( payload=class_schema(SettlementRequest)().dumps( SettlementRequest(settlement_address=set_add_1, measurement_address=self.mea_con_1_add, ggo_addresses=[self.ggo_1_add ])).encode('utf8'), signer_key=self.mea_con_1_key) with self.assertRaises(InvalidTransaction) as invalid_transaction: RetireGGOTransactionHandler().apply(transaction_retire, context) SettlementHandler().apply(transaction_settlement, context) SettlementHandler().apply(transaction_settlement, context) self.assertEqual(str(invalid_transaction.exception), 'Invalid retired GGO in settlement')
def retire_ggo(self, url): key_ggo = self.master_key.ChildKey(4) key_mea = self.master_key.ChildKey(10) signer_mea = self.crypto.new_signer( PrivateKey.from_bytes(key_mea.PrivateKey())) signer_ggo = self.crypto.new_signer( PrivateKey.from_bytes(key_ggo.PrivateKey())) mea_add = generate_address(AddressPrefix.MEASUREMENT, key_mea.PublicKey()) set_add = generate_address(AddressPrefix.SETTLEMENT, key_mea.PublicKey()) ggo_add = generate_address(AddressPrefix.GGO, key_ggo.PublicKey()) retire_request = RetireGGORequest(origin=ggo_add, settlement_address=set_add) retire_response = self.send_request(url, retire_request, [mea_add, set_add, ggo_add], signer_ggo) self.wait_for_commit(retire_response.json()['link']) request = SettlementRequest(settlement_address=set_add, measurement_address=mea_add, ggo_addresses=[ggo_add]) return self.send_request(url, request, [mea_add, set_add, ggo_add], signer_mea)
def transfer_ggo(self, url): key2 = self.master_key.ChildKey(2) key4 = self.master_key.ChildKey(4) signer = self.crypto.new_signer( PrivateKey.from_bytes(key2.PrivateKey())) ggo_add_2 = generate_address(AddressPrefix.GGO, key2.PublicKey()) ggo_add_4 = generate_address(AddressPrefix.GGO, key4.PublicKey()) request = TransferGGORequest(origin=ggo_add_2, destination=ggo_add_4) return self.send_request(url, request, [ggo_add_2, ggo_add_4], signer)
def test_transfer_ggo_no_src_ggo(self): key = BIP32Key.fromEntropy( "the_valid_key_that_owns_the_specific_ggo".encode()) ggo_src = generate_address(AddressPrefix.GGO, key.PublicKey()) ggo_dst = 'ggonextc37509b1de4a7f9f1c59e0efc2ed285e7c96c29d5271edd8b4c2714e3c8979c' context = MockContext(states={}) payload = class_schema(SplitGGORequest)().dumps( SplitGGORequest(origin=ggo_src, parts=[ SplitGGOPart(address="split1_add", amount=10), SplitGGOPart(address="split2_add", amount=20) ])).encode('utf8') transaction = self.create_fake_transaction(inputs=[ggo_src, ggo_dst], outputs=[ggo_src, ggo_dst], payload=payload, key=key) with self.assertRaises(InvalidTransaction) as invalid_transaction: SplitGGOTransactionHandler().apply(transaction, context) self.assertEqual(str(invalid_transaction.exception), f'Address "{ggo_src}" does not contain a valid GGO.')
def split_ggo(self, url): key1 = self.master_key.ChildKey(1) key2 = self.master_key.ChildKey(2) key3 = self.master_key.ChildKey(3) signer = self.crypto.new_signer( PrivateKey.from_bytes(key1.PrivateKey())) ggo_add_1 = generate_address(AddressPrefix.GGO, key1.PublicKey()) ggo_add_2 = generate_address(AddressPrefix.GGO, key2.PublicKey()) ggo_add_3 = generate_address(AddressPrefix.GGO, key3.PublicKey()) request = SplitGGORequest( origin=ggo_add_1, parts=[SplitGGOPart(ggo_add_2, 500), SplitGGOPart(ggo_add_3, 524)]) return self.send_request(url, request, [ggo_add_1, ggo_add_2, ggo_add_3], signer)
def test_transfer_ggo_address_not_empty(self): key = BIP32Key.fromEntropy( "the_valid_key_that_owns_the_specific_ggo".encode()) ggo_src = generate_address(AddressPrefix.GGO, key.PublicKey()) ggo_dst = 'ggonextc37509b1de4a7f9f1c59e0efc2ed285e7c96c29d5271edd8b4c2714e3c8979c' ggo = GGO.get_schema().dumps( GGO(origin= 'meaaaa1c37509b1de4a7f9f1c59e0efc2ed285e7c96c29d5271edd8b4c2714e3c8979c', amount=30, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None)).encode('utf8') ggo2 = GGO.get_schema().dumps( GGO(origin= 'meaaaa29d5271edd8b4c2714e3c8979c1c37509b1de4a7f9f1c59e0efc2ed285e7c96c', amount=123, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None)).encode('utf8') context = MockContext(states={ggo_src: ggo, "split1_add": ggo2}) payload = class_schema(SplitGGORequest)().dumps( SplitGGORequest(origin=ggo_src, parts=[ SplitGGOPart(address="split1_add", amount=10), SplitGGOPart(address="split2_add", amount=20) ])).encode('utf8') transaction = self.create_fake_transaction(inputs=[ggo_src, ggo_dst], outputs=[ggo_src, ggo_dst], payload=payload, key=key) with self.assertRaises(InvalidTransaction) as invalid_transaction: SplitGGOTransactionHandler().apply(transaction, context) self.assertEqual(str(invalid_transaction.exception), 'Destination address not empty')
def issue_ggo(self, url): key = self.master_key.ChildKey(1) signer = self.crypto.new_signer(PrivateKey.from_bytes( key.PrivateKey())) mea_add = generate_address(AddressPrefix.MEASUREMENT, key.PublicKey()) ggo_add = generate_address(AddressPrefix.GGO, key.PublicKey()) request = IssueGGORequest(origin=mea_add, destination=ggo_add, tech_type='T12441', fuel_type='F12412', emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) return self.send_request(url, request, [mea_add, ggo_add], signer)
def publish_con_measurement(self, url): key = self.master_key.ChildKey(10) signer = self.crypto.new_signer(PrivateKey.from_bytes( key.PrivateKey())) add = generate_address(AddressPrefix.MEASUREMENT, key.PublicKey()) request = PublishMeasurementRequest(begin=datetime( 2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), sector='DK1', type=MeasurementType.CONSUMPTION, amount=500) return self.send_request(url, request, [add], signer)
def test_transfer_ggo_success(self): key = BIP32Key.fromEntropy( "the_valid_key_that_owns_the_specific_ggo".encode()) ggo_src = generate_address(AddressPrefix.GGO, key.PublicKey()) ggo = GGO.get_schema().dumps( GGO(origin= 'meaaaa1c37509b1de4a7f9f1c59e0efc2ed285e7c96c29d5271edd8b4c2714e3c8979c', amount=80, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') context = MockContext(states={ggo_src: ggo}) payload = class_schema(SplitGGORequest)().dumps( SplitGGORequest(origin=ggo_src, parts=[ SplitGGOPart(address="split1_add", amount=10), SplitGGOPart(address="split2_add", amount=20), SplitGGOPart(address="split3_add", amount=50) ])).encode('utf8') transaction = self.create_fake_transaction( inputs=[ggo_src, "split1_add", "split2_add", "split3_add"], outputs=[ggo_src, "split1_add", "split2_add", "split3_add"], payload=payload, key=key) SplitGGOTransactionHandler().apply(transaction, context) self.assertIn(ggo_src, context.states) obj = json.loads(context.states[ggo_src].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual( obj['origin'], 'meaaaa1c37509b1de4a7f9f1c59e0efc2ed285e7c96c29d5271edd8b4c2714e3c8979c' ) self.assertEqual(obj['amount'], 80) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual( obj['emissions'], { "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) self.assertEqual(obj['next']['action'], GGOAction.SPLIT.name) self.assertEqual(len(obj['next']['addresses']), 3) self.assertEqual(obj['next']['addresses'][0], 'split1_add') self.assertEqual(obj['next']['addresses'][1], 'split2_add') self.assertEqual(obj['next']['addresses'][2], 'split3_add') obj = json.loads(context.states['split1_add'].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual(obj['origin'], ggo_src) self.assertEqual(obj['amount'], 10) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual( obj['emissions'], { "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) self.assertEqual(obj['next'], None) obj = json.loads(context.states['split2_add'].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual(obj['origin'], ggo_src) self.assertEqual(obj['amount'], 20) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual( obj['emissions'], { "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) self.assertEqual(obj['next'], None) obj = json.loads(context.states['split3_add'].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual(obj['origin'], ggo_src) self.assertEqual(obj['amount'], 50) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual( obj['emissions'], { "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) self.assertEqual(obj['next'], None)
def test_retire_multiple_ggo_two_transations_success(self): set_add = generate_address(AddressPrefix.SETTLEMENT, self.mea_con_1_key.PublicKey()) context = MockContext( states={ self.ggo_1_add: self.ggo_1, self.ggo_2_add: self.ggo_2, self.ggo_3_add: self.ggo_3, self.mea_con_1_add: self.mea_con_1 }) transaction_retire_1 = self.create_fake_transaction( payload=class_schema(RetireGGORequest)().dumps( RetireGGORequest(origin=self.ggo_1_add, settlement_address=set_add)).encode('utf8'), signer_key=self.ggo_1_key) RetireGGOTransactionHandler().apply(transaction_retire_1, context) transaction_retire_2 = self.create_fake_transaction( payload=class_schema(RetireGGORequest)().dumps( RetireGGORequest(origin=self.ggo_2_add, settlement_address=set_add)).encode('utf8'), signer_key=self.ggo_2_key) RetireGGOTransactionHandler().apply(transaction_retire_2, context) transaction_settlement_1 = self.create_fake_transaction( payload=class_schema(SettlementRequest)().dumps( SettlementRequest( settlement_address=set_add, measurement_address=self.mea_con_1_add, ggo_addresses=[self.ggo_1_add, self.ggo_2_add])).encode('utf8'), signer_key=self.mea_con_1_key) SettlementHandler().apply(transaction_settlement_1, context) transaction_retire_3 = self.create_fake_transaction( payload=class_schema(RetireGGORequest)().dumps( RetireGGORequest(origin=self.ggo_3_add, settlement_address=set_add)).encode('utf8'), signer_key=self.ggo_3_key) RetireGGOTransactionHandler().apply(transaction_retire_3, context) transaction_settlement_2 = self.create_fake_transaction( payload=class_schema(SettlementRequest)().dumps( SettlementRequest(settlement_address=set_add, measurement_address=self.mea_con_1_add, ggo_addresses=[self.ggo_3_add ])).encode('utf8'), signer_key=self.mea_con_1_key) SettlementHandler().apply(transaction_settlement_2, context) self.assertIn(self.ggo_1_add, context.states) obj = json.loads(context.states[self.ggo_1_add].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual(obj['origin'], self.mea_prod_1_add) self.assertEqual(obj['amount'], 10) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual(obj['next']['action'], GGOAction.RETIRE.value) self.assertEqual(len(obj['next']['addresses']), 1) self.assertEqual(obj['next']['addresses'][0], set_add) self.assertIn(set_add, context.states) obj = json.loads(context.states[set_add].decode('utf8')) self.assertEqual(len(obj), 2) self.assertEqual(obj['measurement'], self.mea_con_1_add) self.assertIn('parts', obj) self.assertEqual(len(obj['parts']), 3) self.assertEqual(obj['parts'][0]['ggo'], self.ggo_1_add) self.assertEqual(obj['parts'][0]['amount'], 10) self.assertEqual(obj['parts'][1]['ggo'], self.ggo_2_add) self.assertEqual(obj['parts'][1]['amount'], 25) self.assertEqual(obj['parts'][2]['ggo'], self.ggo_3_add) self.assertEqual(obj['parts'][2]['amount'], 15)
def test_retire_single_ggo_success(self): set_add = generate_address(AddressPrefix.SETTLEMENT, self.mea_con_1_key.PublicKey()) context = MockContext(states={ self.ggo_1_add: self.ggo_1, self.mea_con_1_add: self.mea_con_1 }) transaction = self.create_fake_transaction( payload=class_schema(RetireGGORequest)().dumps( RetireGGORequest(origin=self.ggo_1_add, settlement_address=set_add)).encode('utf8'), signer_key=self.ggo_1_key) RetireGGOTransactionHandler().apply(transaction, context) transaction = self.create_fake_transaction( payload=class_schema(SettlementRequest)().dumps( SettlementRequest(settlement_address=set_add, measurement_address=self.mea_con_1_add, ggo_addresses=[self.ggo_1_add ])).encode('utf8'), signer_key=self.mea_con_1_key) SettlementHandler().apply(transaction, context) self.assertIn(self.ggo_1_add, context.states) obj = json.loads(context.states[self.ggo_1_add].decode('utf8')) self.assertEqual(len(obj), 9) self.assertEqual(obj['origin'], self.mea_prod_1_add) self.assertEqual(obj['amount'], 10) self.assertEqual(obj['begin'], '2020-01-01T12:00:00+00:00') self.assertEqual(obj['end'], '2020-01-01T13:00:00+00:00') self.assertEqual(obj['sector'], 'DK1') self.assertEqual(obj['tech_type'], 'T12412') self.assertEqual(obj['fuel_type'], 'F010101') self.assertEqual(obj['next']['action'], GGOAction.RETIRE.value) self.assertEqual(len(obj['next']['addresses']), 1) self.assertEqual(obj['next']['addresses'][0], set_add) self.assertEqual( obj['emissions'], { "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, }) self.assertIn(set_add, context.states) obj = json.loads(context.states[set_add].decode('utf8')) print(context.states) self.assertEqual(len(obj), 2) self.assertEqual(obj['measurement'], self.mea_con_1_add) self.assertIn('parts', obj) self.assertEqual(len(obj['parts']), 1) self.assertEqual(obj['parts'][0]['ggo'], self.ggo_1_add) self.assertEqual(obj['parts'][0]['amount'], 10)
def setUp(self): master_key = BIP32Key.fromEntropy( "bfdgafgaertaehtaha43514r<aefag".encode()) context = create_context('secp256k1') self.key_1 = master_key.ChildKey(1) self.false_key = master_key.ChildKey(1241).ChildKey(1241) self.false_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.false_key.PrivateKey())) self.mea_prod_1_key = master_key.ChildKey(1).ChildKey(1) self.mea_prod_1_add = generate_address(AddressPrefix.MEASUREMENT, self.mea_prod_1_key.PublicKey()) self.mea_prod_1 = Measurement.get_schema().dumps( Measurement(amount=25, type=MeasurementType.PRODUCTION, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), sector='DK1')).encode('utf8') self.mea_prod_2_add = 'mea_prod_2_add' self.mea_prod_3_add = 'mea_prod_3_add' self.mea_con_1_key = master_key.ChildKey(3).ChildKey(1) self.mea_con_1_add = generate_address(AddressPrefix.MEASUREMENT, self.mea_con_1_key.PublicKey()) self.mea_con_1 = Measurement.get_schema().dumps( Measurement(amount=150, type=MeasurementType.CONSUMPTION, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), sector='DK1')).encode('utf8') self.mea_con_2_key = master_key.ChildKey(3).ChildKey(2) self.mea_con_2_add = generate_address(AddressPrefix.MEASUREMENT, self.mea_con_2_key.PublicKey()) self.mea_con_2 = Measurement.get_schema().dumps( Measurement(amount=15, type=MeasurementType.CONSUMPTION, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), sector='DK1')).encode('utf8') self.ggo_1_key = master_key.ChildKey(2).ChildKey(1) self.ggo_1_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_1_key.PrivateKey())) self.ggo_1_add = generate_address(AddressPrefix.GGO, self.ggo_1_key.PublicKey()) self.ggo_1 = GGO.get_schema().dumps( GGO(origin=self.mea_prod_1_add, amount=10, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_2_key = master_key.ChildKey(2).ChildKey(2) self.ggo_2_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_2_key.PrivateKey())) self.ggo_2_add = generate_address(AddressPrefix.GGO, self.ggo_2_key.PublicKey()) self.ggo_2 = GGO.get_schema().dumps( GGO(origin=self.mea_prod_2_add, amount=25, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_3_key = master_key.ChildKey(2).ChildKey(3) self.ggo_3_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_3_key.PrivateKey())) self.ggo_3_add = generate_address(AddressPrefix.GGO, self.ggo_3_key.PublicKey()) self.ggo_3 = GGO.get_schema().dumps( GGO(origin=self.mea_prod_3_add, amount=15, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_DK2_key = master_key.ChildKey(2).ChildKey(3) self.ggo_DK2_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_DK2_key.PrivateKey())) self.ggo_DK2_add = generate_address(AddressPrefix.GGO, self.ggo_DK2_key.PublicKey()) self.ggo_DK2 = GGO.get_schema().dumps( GGO(origin=self.mea_prod_3_add, amount=15, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK2', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_other_time_key = master_key.ChildKey(2).ChildKey(3) self.ggo_other_time_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_other_time_key.PrivateKey())) self.ggo_other_time_add = generate_address( AddressPrefix.GGO, self.ggo_other_time_key.PublicKey()) self.ggo_other_time = GGO.get_schema().dumps( GGO(origin=self.mea_prod_3_add, amount=15, begin=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 14, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=None, emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_used_key = master_key.ChildKey(2).ChildKey(54687) self.ggo_used_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_used_key.PrivateKey())) self.ggo_used_add = generate_address(AddressPrefix.GGO, self.ggo_used_key.PublicKey()) self.ggo_used = GGO.get_schema().dumps( GGO(origin='mea_prod_used_add', amount=15, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=GGONext(action=GGOAction.RETIRE, addresses=['mea_con_used_add']), emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_used_multiple_key = master_key.ChildKey(2).ChildKey(54687) self.ggo_used_multiple_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_used_multiple_key.PrivateKey())) self.ggo_used_multiple_add = generate_address( AddressPrefix.GGO, self.ggo_used_multiple_key.PublicKey()) self.ggo_used_multiple = GGO.get_schema().dumps( GGO(origin='mea_prod_used_add', amount=15, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=GGONext( action=GGOAction.RETIRE, addresses=['mea_con_used_add', 'mea_con_used_add2']), emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8') self.ggo_transfered_key = master_key.ChildKey(2).ChildKey(54688) self.ggo_transfered_signer = CryptoFactory(context).new_signer( PrivateKey.from_bytes(self.ggo_transfered_key.PrivateKey())) self.ggo_transfered_add = generate_address( AddressPrefix.GGO, self.ggo_transfered_key.PublicKey()) self.ggo_transfered = GGO.get_schema().dumps( GGO(origin='mea_prod_used_add', amount=15, begin=datetime(2020, 1, 1, 12, tzinfo=timezone.utc), end=datetime(2020, 1, 1, 13, tzinfo=timezone.utc), tech_type='T12412', fuel_type='F010101', sector='DK1', next=GGONext(action=GGOAction.TRANSFER, addresses=['mea_con_used_add']), emissions={ "co2": { "value": 1113342.14, "unit": "g/Wh", }, "so2": { "value": 9764446, "unit": "g/Wh", }, })).encode('utf8')