Esempio n. 1
0
    async def run(self, ctx: Config):
        async with flow_client(host=ctx.access_node_host,
                               port=ctx.access_node_port) as client:
            pub_key, priv_key = random_key_pair(SignAlgo.ECDSA_secp256k1)

            # prepare parameters
            account_key = AccountKey(
                public_key=pub_key,
                sign_algo=SignAlgo.ECDSA_secp256k1,
                hash_algo=HashAlgo.SHA3_256,
            )

            block = await client.get_latest_block()
            proposer = await client.get_account_at_latest_block(
                address=ctx.service_account_address.bytes)

            tx = (create_account_template(keys=[account_key]).add_authorizers(
                ctx.service_account_address).with_reference_block_id(block.id).
                  with_payer(ctx.service_account_address).with_proposal_key(
                      ProposalKey(
                          key_address=ctx.service_account_address,
                          key_id=ctx.service_account_key_id,
                          key_sequence_number=proposer.keys[
                              ctx.service_account_key_id].sequence_number,
                      )).with_payload_signature(
                          ctx.service_account_address, 0,
                          ctx.service_account_signer).with_envelope_signature(
                              ctx.service_account_address, 0,
                              ctx.service_account_signer))

            result = await client.execute_transaction(tx)

            log.info(f"new address {result.events[0]}")
    async def run(self, ctx: Config):
        async with flow_client(host=ctx.access_node_host,
                               port=ctx.access_node_port) as client:
            address, _, _ = await random_account(
                client=client,
                ctx=ctx,
                contracts={
                    "EventDemo":
                    """
                        pub contract EventDemo {
                            pub event Add(x: Int, y: Int, sum: Int)

                            pub fun add(_ x: Int, _ y: Int) {
                                let sum = x + y
                                emit Add(x: x, y: y, sum: sum)
                            }
                        }""",
                },
            )

            block = await client.get_latest_block()
            proposer = await client.get_account_at_latest_block(
                address=ctx.service_account_address.bytes)

            tx = Tx(
                code=f"""
                import EventDemo from {address.hex_with_prefix()}
                
                transaction() {{
                    prepare() {{
                        EventDemo.add(1, 6)
                    }}
                }}
                """,
                reference_block_id=block.id,
                payer=ctx.service_account_address,
                proposal_key=ProposalKey(
                    key_address=ctx.service_account_address,
                    key_id=ctx.service_account_key_id,
                    key_sequence_number=proposer.keys[
                        ctx.service_account_key_id].sequence_number,
                ),
            ).with_envelope_signature(
                ctx.service_account_address,
                ctx.service_account_key_id,
                ctx.service_account_signer,
            )

            result = await client.execute_transaction(tx)

            add_event = [
                e.value for e in result.events
                if isinstance(e.value, cadence.Event)
            ][0]

            assert add_event.fields[2].as_type(cadence.Int).value == 7
Esempio n. 3
0
    async def run(self, ctx: Config):
        async with flow_client(host=ctx.access_node_host,
                               port=ctx.access_node_port) as client:
            pub_key, _ = random_key_pair(SignAlgo.ECDSA_secp256k1)

            # prepare parameters
            account_key = AccountKey(
                public_key=pub_key,
                sign_algo=SignAlgo.ECDSA_secp256k1,
                hash_algo=HashAlgo.SHA3_256,
            )
            account_key_hex = cadence.String(account_key.hex())
            cadence_public_keys = cadence.Array([account_key_hex])
            cadence_contracts = cadence.Dictionary([])

            block = await client.get_latest_block()
            proposer = await client.get_account_at_latest_block(
                address=ctx.service_account_address.bytes)

            tx = (Tx(
                code="""
                    transaction(publicKeys: [String], contracts:{String: String}) {
                        prepare(signer: AuthAccount) {
                            let acct = AuthAccount(payer: signer)
                    
                            for key in publicKeys {
                                acct.addPublicKey(key.decodeHex())
                            }
                    
                            for contract in contracts.keys {
                                acct.contracts.add(name: contract, code: contracts[contract]!.decodeHex())
                            }
                        }
                    }
                """,
                reference_block_id=block.id,
                payer=ctx.service_account_address,
                proposal_key=ProposalKey(
                    key_address=ctx.service_account_address,
                    key_id=ctx.service_account_key_id,
                    key_sequence_number=proposer.keys[
                        ctx.service_account_key_id].sequence_number,
                ),
            ).add_authorizers(
                ctx.service_account_address).add_arguments(cadence_public_keys)
                  .add_arguments(cadence_contracts).with_payload_signature(
                      ctx.service_account_address, 0,
                      ctx.service_account_signer).with_envelope_signature(
                          ctx.service_account_address, 0,
                          ctx.service_account_signer))

            await client.execute_transaction(tx)
Esempio n. 4
0
async def random_account(
    *,
    client: AccessAPI,
    ctx: Config,
    contracts: dict[Annotated[str, "name"], Annotated[str, "source"]] = None,
) -> (cadence.Address, AccountKey, Signer):
    pub, priv = random_key_pair(SignAlgo.ECDSA_secp256k1)

    account_key = AccountKey(public_key=pub,
                             sign_algo=SignAlgo.ECDSA_secp256k1,
                             hash_algo=HashAlgo.SHA3_256)

    block = await client.get_latest_block()
    proposer = await client.get_account_at_latest_block(
        address=ctx.service_account_address.bytes)

    tx = (create_account_template(
        keys=[account_key],
        contracts=contracts,
        reference_block_id=block.id,
        payer=ctx.service_account_address,
        proposal_key=ProposalKey(
            key_address=ctx.service_account_address,
            key_id=ctx.service_account_key_id,
            key_sequence_number=proposer.keys[
                ctx.service_account_key_id].sequence_number,
        ),
    ).add_authorizers(ctx.service_account_address).with_envelope_signature(
        ctx.service_account_address, 0, ctx.service_account_signer))

    result = await client.execute_transaction(tx)
    new_addresses = [
        e.value.address for e in result.events
        if isinstance(e.value, cadence.AccountCreatedEvent)
    ]

    return (
        new_addresses[0],
        account_key,
        InMemorySigner(
            sign_algo=SignAlgo.ECDSA_secp256k1,
            hash_algo=HashAlgo.SHA3_256,
            private_key_hex=priv.hex(),
        ),
    )
Esempio n. 5
0
    async def run(self, ctx: Config):
        async with flow_client(host=ctx.access_node_host,
                               port=ctx.access_node_port) as client:
            block = await client.get_latest_block()
            proposer = await client.get_account_at_latest_block(
                address=ctx.service_account_address.bytes)

            tx = Tx(
                code="""transaction(){prepare(){log("OK")}}""",
                reference_block_id=block.id,
                payer=ctx.service_account_address,
                proposal_key=ProposalKey(
                    key_address=ctx.service_account_address,
                    key_id=ctx.service_account_key_id,
                    key_sequence_number=proposer.keys[
                        ctx.service_account_key_id].sequence_number,
                ),
            ).with_envelope_signature(
                ctx.service_account_address,
                ctx.service_account_key_id,
                ctx.service_account_signer,
            )

            await client.execute_transaction(tx)
    async def run(self, ctx: Config):
        async with flow_client(host=ctx.access_node_host,
                               port=ctx.access_node_port) as client:
            address, _, _ = await random_account(
                client=client,
                ctx=ctx,
                contracts={
                    "EventDemo":
                    """
                        pub contract EventDemo {
                            pub event Add(x: Int, y: Int, sum: Int)

                            pub fun add(_ x: Int, _ y: Int) {
                                let sum = x + y
                                emit Add(x: x, y: y, sum: sum)
                            }
                        }""",
                },
            )

            class AddEvent(cadence.BaseEvent):
                def __init__(self, fields: list[cadence.Value],
                             event_type: cadence.EventType):
                    super().__init__(fields, event_type)
                    self.x = self.fields[0].as_type(cadence.Int).value
                    self.y = self.fields[1].as_type(cadence.Int).value
                    self.sum = self.fields[2].as_type(cadence.Int).value

                @classmethod
                def event_id_constraint(cls) -> str:
                    return f"A.{address.hex()}.EventDemo.Add"

            cadence.EventTypeRegistry.register_event_type(AddEvent)

            block = await client.get_latest_block()
            proposer = await client.get_account_at_latest_block(
                address=ctx.service_account_address.bytes)

            tx = Tx(
                code=f"""
                import EventDemo from {address.hex_with_prefix()}

                transaction() {{
                    prepare() {{
                        EventDemo.add(1, 6)
                    }}
                }}
                """,
                reference_block_id=block.id,
                payer=ctx.service_account_address,
                proposal_key=ProposalKey(
                    key_address=ctx.service_account_address,
                    key_id=ctx.service_account_key_id,
                    key_sequence_number=proposer.keys[
                        ctx.service_account_key_id].sequence_number,
                ),
            ).with_envelope_signature(
                ctx.service_account_address,
                ctx.service_account_key_id,
                ctx.service_account_signer,
            )

            result = await client.execute_transaction(tx)

            add_event = [
                e.value for e in result.events
                if isinstance(e.value, AddEvent)
            ][0]

            assert add_event.sum == 7