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)
示例#4
0
    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)
示例#6
0
    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)
示例#9
0
    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')