From 3a9484f8dccc969eeff58d621f52e9af9ab579ec Mon Sep 17 00:00:00 2001 From: Felix Nicolae Bucsa Date: Tue, 6 Dec 2022 11:43:51 +0100 Subject: [PATCH 1/3] Added core components section of the introduction --- docs/index.md | 62 ---------- .../core-concepts/core-components.md | 117 ++++++++++++++++++ docs/introduction/core-concepts/img.png | Bin 0 -> 47703 bytes mkdocs.yml | 4 +- 4 files changed, 120 insertions(+), 63 deletions(-) delete mode 100644 docs/index.md create mode 100644 docs/introduction/core-concepts/core-components.md create mode 100644 docs/introduction/core-concepts/img.png diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index f852eab46f..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,62 +0,0 @@ - -The AEA framework provides the tools for creating Autonomous Economic Agents (AEA). - -## What are AEAs? - -We define an autonomous economic agent or AEA as: - -> An intelligent agent acting on an owner's behalf, with limited or no interference, and whose goal is to generate economic value for its owner. - - - -An AEA represents an individual, organisation or object and looks after its interests. AEAs act independently of constant input from their owner and autonomously execute actions to achieve their prescribed goals. Their purpose is to create economic value for you, their owner, in clearly defined domains. AEAs have a wide range of application areas and we provide demo guides to highlight examples of their use cases. - -### What is not an AEA - -* Any agent: AEAs' purpose is to generate economic value in a multi-stakeholder environment with competing incentives between agents. They represent humans, organisations or objects. -* APIs or sensors which do not have agency. -* Smart contracts which do not display any proactiveness and are purely reactive to external requests (=contract calls and transactions). -* Artificial General Intelligence (AGI). AEAs can have a very narrow, goal directed focus involving some economic gain and can have a very simple logic. - -
-

Note

-

In the rest of the documentation, unless specified otherwise, we use the terms AEA and agent interchangeably to refer to AEA as defined above.

-
- -## What is the AEA Framework? - -The AEA framework is a development suite, currently implemented in Python, which equips you with an efficient and accessible set of tools for building and running AEAs. The framework is modular, extensible, and composable. It attempts to make agent development as straightforward an experience as possible, similar to web development using popular web frameworks. - -AEAs achieve their goals with the help of a search & discovery service for AEAs -- the simple Open Economic Framework (sOEF) -- a decentralized agent communication system -- the Agent Communication Network (ACN) -- and using Fetch.ai's blockchain as a financial settlement and commitment layer. AEAs can also be integrated with third-party blockchains, such as Ethereum. - - -## Why build with the AEA Framework? - -The AEA framework provides the developer with a number of features, which combined cannot be found anywhere else: - -* The peer-to-peer agent communication network (ACN) allows your AEAs to interact with all other AEAs over the public internet. -* The search and discovery system sOEF allows your AEAs to find other AEAs. -* The AEA registry enables code sharing and re-use by providing a space in which AEAs or their individual components may be shared. -* The framework's crypto and ledger APIs make it possible for AEAs to interact with blockchains. -* The contract packages enable AEAs to interact with smart contracts in Fetch.ai and other third-party decentralised ledgers. - - -## Next steps - -To get started developing your own AEA, check out the getting started section. - -To learn more about some of the distinctive characteristics of agent-oriented development, check out the guide on agent-oriented development. - -If you would like to develop an AEA in a language different to Python then check out our language agnostic AEA definition. - -If you want to run a demo, check out the demo guides. - - -## Help us improve - -
-

Note

-

This developer documentation is a work in progress. If you spot any errors please open an issue on Github or contact us in the developer Discord channel.

-
- -
diff --git a/docs/introduction/core-concepts/core-components.md b/docs/introduction/core-concepts/core-components.md new file mode 100644 index 0000000000..354010b4ff --- /dev/null +++ b/docs/introduction/core-concepts/core-components.md @@ -0,0 +1,117 @@ +The AEA framework consists of several core components, some required to run an AEA and others optional. + +The following sections discuss the inner workings of the AEA framework and how it calls the code in custom packages (see inversion of control and a helpful comparison here). Whilst it is in principle possible to use parts of the framework as a library, we do not recommend it. + +## Envelope + +`AEA` objects communicate asynchronously via `Envelopes`. + +An `Envelope` is the core object with which agents communicate. It is a vehicle for `Messages` with five attributes: + +* `to`: defines the destination address. + +* `sender`: defines the sender address. + +* `protocol_id`: defines the id of the `Protocol`. + +* `message`: is a bytes field which holds the `Message` in serialized form. + +* `Optional[context]`: an optional field to specify routing information in a URI. + +`Messages` must adhere to a `Protocol`. + +## Protocol + +`Protocols` define agent-to-agent as well as component-to-component interactions within AEAs. As such, they include: + +* `Messages` defining the syntax of messages; + +* `Serialization` defining how a `Message` is encoded for transport; and, optionally + +* `Dialogues`, which define rules over `Message` sequences. + +The framework provides one default `Protocol`, called `default` (current version `fetchai/default:1.1.6`). This `Protocol` provides a bare-bones implementation for an AEA `Protocol` which includes a `DefaultMessage` class and associated `DefaultSerializer` and `DefaultDialogue` classes. + +Additional `Protocols`, for new types of interactions, can be added as packages. For more details on `Protocols` you can read the protocol guide. To learn how you can easily automate protocol definition, head to the guide for the protocol generator. [ADD LINK] + +Protocol specific `Messages`, wrapped in `Envelopes`, are sent and received to other agents, agent components and services via `Connections`. + +## Connection + +A `Connection` wraps an SDK or API and provides an interface to networks, ledgers or other services. Where necessary, a `Connection` is responsible for translating between the framework specific `Envelope` with its contained `Message` and the external service or third-party protocol (e.g. `HTTP`). + +The framework provides one default `Connection`, called `stub` (current version `fetchai/stub:0.21.2`). It implements an I/O reader and writer to send `Messages` to the agent from a local file. + +Additional `Connections` can be added as packages. For more details on `Connections` read the `Connection` guide . [ADD LINK] + +An AEA runs and manages `Connections` via a `Multiplexer`. + +## Multiplexer + +The `Multiplexer` is responsible for maintaining (potentially multiple) `Connections`. + +It maintains an `InBox` and `OutBox`, which are, respectively, queues for incoming and outgoing `Envelopes` from the perspective of `Skills`. + +### Skill + +`Skills` are the core focus of the framework's extensibility as they implement business logic to deliver economic value for the AEA. They are self-contained capabilities that AEAs can dynamically take on board, in order to expand their effectiveness in different situations. + +A `Skill` encapsulates implementations of the three abstract base classes `Handler`, `Behaviour`, `Model`, and is closely related with the abstract base class `Task`: + +* `Handler`: each `Skill` has zero, one or more `Handler` objects. There is a one-to-one correspondence between `Handlers` and the protocols in an AEA (also known as the _registered protocols_). Handlers implement AEAs' **reactive** behaviour. If an AEA understands a `Protocol` referenced in a received `Envelope` (i.e. the protocol is registered in this AEA), this envelope is sent to the corresponding `Handler` which executes the AEA's reaction to this `Message`. +* `Behaviour`: a `skill` can have zero, one or more `Behaviours`, each encapsulating actions which further the AEAs goal and are initiated by internals of the AEA rather than external events. Behaviours implement AEAs' **pro-activeness**. The framework provides a number of abstract base classes implementing different types of simple and composite behaviours (e.g. cyclic, one-shot, finite-state-machine, etc), and these define how often and in what order a behaviour and its sub-behaviours must be executed. +* `Model`: zero, one or more `Models` that inherit from the `Model` abstract base class and are accessible via the `SkillContext`. +* `Task`: zero, one or more `Tasks` encapsulate background work internal to the AEA. `Task` differs from the other three in that it is not a part of `Skills`, but `Tasks` are declared in or from `Skills` if a packaging approach for AEA creation is used. + +A `Skill` can read (parts of) an AEA's state (as summarised in the `AgentContext`), and suggests actions to the AEA according to its specific logic. As such, more than one `Skill` could exist per `Protocol`, competing with each other in suggesting to the AEA the best course of actions to take. In technical terms, this means `Skills` are horizontally arranged. + +For instance, an AEA which is trading goods, could subscribe to more than one `Skill`, where each corresponds to a different trading strategy. + +The framework places no limits on the complexity of `Skills`. They can implement simple (e.g. `if-this-then-that`) logic or be complex (e.g. a deep learning model or reinforcement learning agent). + +The framework provides one default `Skill`, called `error`. Additional `Skills` can be added as packages. For more details on `Skills` head over to the `Skill` guide . [ADD LINK] + +### Agent loop + +The `AgentLoop` performs a series of activities while the `AEA` state is not `stopped`. + +* it calls the `act()` function of all active registered `Behaviours` at their respective tick rate. +* it grabs all Envelopes waiting in the `InBox` queue and calls the `handle()` function for the `Handlers` currently registered against the `Protocol` of the `Envelope`. +* it dispatches the internal `Messages` from the decision maker (described below) to the handler in the relevant `Skill`. + +The `AgentLoop` and `Multiplexer` are decoupled via the `InBox` and `OutBox`, and both are maintained by the `Runtime`. + +## Decision Maker + +The `DecisionMaker` can be thought of as a `Wallet` manager plus "economic brain" of the AEA. It is responsible for the AEA's crypto-economic security and goal management, and it contains the preference and ownership representation of the AEA. The decision maker is the only component with access to the `Wallet`'s private keys. + +You can learn more about the decision maker here. In its simplest form, the decision maker acts like a `Wallet` with `Handler` to react to messages it receives from the skills. + +## Wallet + +The `Wallet` contains the private-public key pairs used by the AEA. Skills do not have access to the wallet, only the decision maker does. + +The agent has two sets of private keys, as configured in the `aea-config.yaml`: + +- `private_key_paths`: This is a dictionary mapping identifiers to the file paths of private keys used in the AEA. For each identifier, e.g. `fetchai`, the AEA can have one private key. The private keys listed here are available in the `Decision Maker` and the associated public keys and addresses are available in all skills. The AEA uses these keys to sign transactions and messages. These keys usually hold the AEAs funds. +- `connection_private_key_paths`: This is a dictionary mapping identifiers to the file paths of private keys used in connections. For each identifier, e.g. `fetchai`, the `Multiplexer` can have one private key. The private keys listed here are available in the connections. The connections use these keys to secure message transport, for instance. + +!!! warning + + It is the responsibility of the AEA's user to safeguard the keys used and ensure that keys are only used in a single AEA. Using the same key across different AEAs will lead to various failure modes. + +Private keys can be encrypted at rest. The CLI commands used for interacting with the wallet allow specifying a password for encryption/decryption. + +## Identity + +The `Identity` is an abstraction that represents the identity of an AEA in the Open Economic Framework, backed by public-key cryptography. It contains the AEA's addresses as well as its name. + +The identity can be accessed in a `Skill` via the `AgentContext`. + +## Contracts + +`Contracts` wrap smart contracts for third-party decentralized ledgers. In particular, they provide wrappers around the API or ABI of a smart contract. They expose an API to abstract implementation specifics of the ABI from the `Skills`. + +`Contracts` usually contain the logic to create contract transactions and make contract calls. + +`Contracts` can be added as packages. For more details on `Contracts` also read the `Contract` guide here. diff --git a/docs/introduction/core-concepts/img.png b/docs/introduction/core-concepts/img.png new file mode 100644 index 0000000000000000000000000000000000000000..12e99d3e00aa94b2613f201fbf2b60c344c962df GIT binary patch literal 47703 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�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 Date: Tue, 6 Dec 2022 12:04:24 +0100 Subject: [PATCH 2/3] Added core components section of the introduction --- docs/core-components-1.md | 117 ------------------ docs/core-components-2.md | 72 ----------- .../core-concepts/core-components.md | 23 ++-- docs/introduction/core-concepts/img.png | Bin 47703 -> 0 bytes mkdocs.yml | 2 - 5 files changed, 14 insertions(+), 200 deletions(-) delete mode 100644 docs/core-components-1.md delete mode 100644 docs/core-components-2.md delete mode 100644 docs/introduction/core-concepts/img.png diff --git a/docs/core-components-1.md b/docs/core-components-1.md deleted file mode 100644 index 2ded1b513d..0000000000 --- a/docs/core-components-1.md +++ /dev/null @@ -1,117 +0,0 @@ -The AEA framework consists of several core components, some required to run an AEA and others optional. - -The following sections discuss the inner workings of the AEA framework and how it calls the code in custom packages (see inversion of control and a helpful comparison here). Whilst it is in principle possible to use parts of the framework as a library, we do not recommend it. - -## The elements each AEA uses - -### Envelope - -Envelope of an AEA - -`AEA` objects communicate asynchronously via `Envelopes`. - -An `Envelope` is the core object with which agents communicate. It is a vehicle for `Messages` with five attributes: - -* `to`: defines the destination address. - -* `sender`: defines the sender address. - -* `protocol_id`: defines the id of the `Protocol`. - -* `message`: is a bytes field which holds the `Message` in serialized form. - -* `Optional[context]`: an optional field to specify routing information in a URI. - -`Messages` must adhere to a `Protocol`. - -### Protocol - -`Protocols` define agent-to-agent as well as component-to-component interactions within AEAs. As such, they include: - -* `Messages` defining the syntax of messages; - -* `Serialization` defining how a `Message` is encoded for transport; and, optionally - -* `Dialogues`, which define rules over `Message` sequences. - -The framework provides one default `Protocol`, called `default` (current version `fetchai/default:1.1.6`). This `Protocol` provides a bare-bones implementation for an AEA `Protocol` which includes a `DefaultMessage` class and associated `DefaultSerializer` and `DefaultDialogue` classes. - -Additional `Protocols`, for new types of interactions, can be added as packages. For more details on `Protocols` you can read the protocol guide. To learn how you can easily automate protocol definition, head to the guide for the protocol generator. - -Protocol specific `Messages`, wrapped in `Envelopes`, are sent and received to other agents, agent components and services via `Connections`. - -### Connection - -A `Connection` wraps an SDK or API and provides an interface to networks, ledgers or other services. Where necessary, a `Connection` is responsible for translating between the framework specific `Envelope` with its contained `Message` and the external service or third-party protocol (e.g. `HTTP`). - -The framework provides one default `Connection`, called `stub` (current version `fetchai/stub:0.21.2`). It implements an I/O reader and writer to send `Messages` to the agent from a local file. - -Additional `Connections` can be added as packages. For more details on `Connections` read the `Connection` guide . - -An AEA runs and manages `Connections` via a `Multiplexer`. - -### Multiplexer - -Multiplexer of an AEA - -The `Multiplexer` is responsible for maintaining (potentially multiple) `Connections`. - -It maintains an `InBox` and `OutBox`, which are, respectively, queues for incoming and outgoing `Envelopes` from the perspective of `Skills`. - -### Skill - -Skills of an AEA - -`Skills` are the core focus of the framework's extensibility as they implement business logic to deliver economic value for the AEA. They are self-contained capabilities that AEAs can dynamically take on board, in order to expand their effectiveness in different situations. - -A `Skill` encapsulates implementations of the three abstract base classes `Handler`, `Behaviour`, `Model`, and is closely related with the abstract base class `Task`: - -* `Handler`: each `Skill` has zero, one or more `Handler` objects. There is a one-to-one correspondence between `Handlers` and the protocols in an AEA (also known as the _registered protocols_). Handlers implement AEAs' **reactive** behaviour. If an AEA understands a `Protocol` referenced in a received `Envelope` (i.e. the protocol is registered in this AEA), this envelope is sent to the corresponding `Handler` which executes the AEA's reaction to this `Message`. -* `Behaviour`: a `skill` can have zero, one or more `Behaviours`, each encapsulating actions which further the AEAs goal and are initiated by internals of the AEA rather than external events. Behaviours implement AEAs' **pro-activeness**. The framework provides a number of abstract base classes implementing different types of simple and composite behaviours (e.g. cyclic, one-shot, finite-state-machine, etc), and these define how often and in what order a behaviour and its sub-behaviours must be executed. -* `Model`: zero, one or more `Models` that inherit from the `Model` abstract base class and are accessible via the `SkillContext`. -* `Task`: zero, one or more `Tasks` encapsulate background work internal to the AEA. `Task` differs from the other three in that it is not a part of `Skills`, but `Tasks` are declared in or from `Skills` if a packaging approach for AEA creation is used. - -A `Skill` can read (parts of) an AEA's state (as summarised in the `AgentContext`), and suggests actions to the AEA according to its specific logic. As such, more than one `Skill` could exist per `Protocol`, competing with each other in suggesting to the AEA the best course of actions to take. In technical terms, this means `Skills` are horizontally arranged. - -For instance, an AEA which is trading goods, could subscribe to more than one `Skill`, where each corresponds to a different trading strategy. - -The framework places no limits on the complexity of `Skills`. They can implement simple (e.g. `if-this-then-that`) logic or be complex (e.g. a deep learning model or reinforcement learning agent). - -The framework provides one default `Skill`, called `error`. Additional `Skills` can be added as packages. For more details on `Skills` head over to the `Skill` guide . - -### Agent loop - -The `AgentLoop` performs a series of activities while the `AEA` state is not `stopped`. - -* it calls the `act()` function of all active registered `Behaviours` at their respective tick rate. -* it grabs all Envelopes waiting in the `InBox` queue and calls the `handle()` function for the `Handlers` currently registered against the `Protocol` of the `Envelope`. -* it dispatches the internal `Messages` from the decision maker (described below) to the handler in the relevant `Skill`. - -The `AgentLoop` and `Multiplexer` are decoupled via the `InBox` and `OutBox`, and both are maintained by the `Runtime`. - -## Next steps - -### Recommended - -We recommend you continue with the next step in the 'Getting Started' series: - -- AEA and web frameworks - -### Relevant deep-dives - -Most AEA development focuses on developing the `Skills` and `Protocols` necessary for an AEA to deliver against its economic objectives. - -Understanding `Protocols` is core to developing your own agent. You can learn more about the `Protocols` agents use to communicate with each other and how they are created in the following section: - -- Protocols - -Most of an AEA developer's time is spent on `Skill` development. `Skills` are the core business logic components of an AEA. Check out the following guide to learn more: - -- Skills - -In most cases, one of the available `Connection` packages can be used. Occasionally, you might develop your own `Connection`: - -- Connections - -
- diff --git a/docs/core-components-2.md b/docs/core-components-2.md deleted file mode 100644 index 2c63f56977..0000000000 --- a/docs/core-components-2.md +++ /dev/null @@ -1,72 +0,0 @@ -The AEA framework consists of several core components, some required to run an AEA and others optional. - -In Core Components - Part 1 we described the common components each AEA uses. In this page, we will look at more advanced components. - -## Required components used by AEAs - -### Decision Maker - -Decision Maker of an AEA - -The `DecisionMaker` can be thought of as a `Wallet` manager plus "economic brain" of the AEA. It is responsible for the AEA's crypto-economic security and goal management, and it contains the preference and ownership representation of the AEA. The decision maker is the only component with access to the `Wallet`'s private keys. - -You can learn more about the decision maker here. In its simplest form, the decision maker acts like a `Wallet` with `Handler` to react to messages it receives from the skills. - -### Wallet - -The `Wallet` contains the private-public key pairs used by the AEA. Skills do not have access to the wallet, only the decision maker does. - -The agent has two sets of private keys, as configured in the `aea-config.yaml`: - -- `private_key_paths`: This is a dictionary mapping identifiers to the file paths of private keys used in the AEA. For each identifier, e.g. `fetchai`, the AEA can have one private key. The private keys listed here are available in the `Decision Maker` and the associated public keys and addresses are available in all skills. The AEA uses these keys to sign transactions and messages. These keys usually hold the AEAs funds. -- `connection_private_key_paths`: This is a dictionary mapping identifiers to the file paths of private keys used in connections. For each identifier, e.g. `fetchai`, the `Multiplexer` can have one private key. The private keys listed here are available in the connections. The connections use these keys to secure message transport, for instance. - -It is the responsibility of the AEA's user to safe-guard the keys used and ensure that keys are only used in a single AEA. Using the same key across different AEAs will lead to various failure modes. - -Private keys can be encrypted at rest. The CLI commands used for interacting with the wallet allow specifying a password for encryption/decryption. - -### Identity - -The `Identity` is an abstraction that represents the identity of an AEA in the Open Economic Framework, backed by public-key cryptography. It contains the AEA's addresses as well as its name. - -The identity can be accessed in a `Skill` via the `AgentContext`. - -## Optional components used by AEAs - -### Contracts - -Contracts of an AEA - -`Contracts` wrap smart contracts for third-party decentralized ledgers. In particular, they provide wrappers around the API or ABI of a smart contract. They expose an API to abstract implementation specifics of the ABI from the `Skills`. - -`Contracts` usually contain the logic to create contract transactions and make contract calls. - -`Contracts` can be added as packages. For more details on `Contracts` also read the `Contract` guide here. - -## Putting it together - -Taken together, the core components from this section and the first part provide the following simplified illustration of an AEA: - -Simplified illustration of an AEA - -## Next steps - -### Recommended - -We recommend you continue with the next step in the 'Getting Started' series: - -- How AEAs talk to each other - Interaction protocols - -### Relevant deep-dives - -Understanding the decision maker is vital to developing a goal oriented and crypto-economically safe AEA. You can learn more about the `DecisionMaker` in the following section: - -- Decision Maker - - -Understanding `Contracts` is important when developing AEAs that make commitments or use smart contracts for other purposes. You can learn more about the `Contracts` agents use in the following section: - -- Contracts - - -
diff --git a/docs/introduction/core-concepts/core-components.md b/docs/introduction/core-concepts/core-components.md index 354010b4ff..f6ea4bdeb4 100644 --- a/docs/introduction/core-concepts/core-components.md +++ b/docs/introduction/core-concepts/core-components.md @@ -1,8 +1,9 @@ -The AEA framework consists of several core components, some required to run an AEA and others optional. +The AEA framework consists of several core components. The following sections discuss the inner workings of the AEA framework and how it calls the code in custom packages (see inversion of control and a helpful comparison here). Whilst it is in principle possible to use parts of the framework as a library, we do not recommend it. -## Envelope + +### Envelope `AEA` objects communicate asynchronously via `Envelopes`. @@ -20,7 +21,7 @@ An `Envelope` is the core object `Messages` must adhere to a `Protocol`. -## Protocol +### Protocol `Protocols` define agent-to-agent as well as component-to-component interactions within AEAs. As such, they include: @@ -36,7 +37,7 @@ Additional `Protocols`, for new types of interactions, can be added as packages. Protocol specific `Messages`, wrapped in `Envelopes`, are sent and received to other agents, agent components and services via `Connections`. -## Connection +### Connection A `Connection` wraps an SDK or API and provides an interface to networks, ledgers or other services. Where necessary, a `Connection` is responsible for translating between the framework specific `Envelope` with its contained `Message` and the external service or third-party protocol (e.g. `HTTP`). @@ -46,7 +47,7 @@ Additional `Connections` can be added as packages. For more details on `Connecti An AEA runs and manages `Connections` via a `Multiplexer`. -## Multiplexer +### Multiplexer The `Multiplexer` is responsible for maintaining (potentially multiple) `Connections`. @@ -81,13 +82,13 @@ The `AgentLoop` performs a The `AgentLoop` and `Multiplexer` are decoupled via the `InBox` and `OutBox`, and both are maintained by the `Runtime`. -## Decision Maker +### Decision Maker The `DecisionMaker` can be thought of as a `Wallet` manager plus "economic brain" of the AEA. It is responsible for the AEA's crypto-economic security and goal management, and it contains the preference and ownership representation of the AEA. The decision maker is the only component with access to the `Wallet`'s private keys. You can learn more about the decision maker here. In its simplest form, the decision maker acts like a `Wallet` with `Handler` to react to messages it receives from the skills. -## Wallet +### Wallet The `Wallet` contains the private-public key pairs used by the AEA. Skills do not have access to the wallet, only the decision maker does. @@ -102,16 +103,20 @@ The agent has two sets of private keys, as configured in the `aea-config.yaml`: Private keys can be encrypted at rest. The CLI commands used for interacting with the wallet allow specifying a password for encryption/decryption. -## Identity +### Identity The `Identity` is an abstraction that represents the identity of an AEA in the Open Economic Framework, backed by public-key cryptography. It contains the AEA's addresses as well as its name. The identity can be accessed in a `Skill` via the `AgentContext`. -## Contracts +### Contracts `Contracts` wrap smart contracts for third-party decentralized ledgers. In particular, they provide wrappers around the API or ABI of a smart contract. They expose an API to abstract implementation specifics of the ABI from the `Skills`. `Contracts` usually contain the logic to create contract transactions and make contract calls. `Contracts` can be added as packages. For more details on `Contracts` also read the `Contract` guide here. + +!!! note + + Contracts are an optional element of the Framework. diff --git a/docs/introduction/core-concepts/img.png b/docs/introduction/core-concepts/img.png deleted file mode 100644 index 12e99d3e00aa94b2613f201fbf2b60c344c962df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47703 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�zGCS6TMtbAlgYP`_6}f{tUHQOUW*kGzmq$u4{vE6OGwZk%fn~hH4Akex}%S; zAksVM64$9HB|k41kiahW273VYrHqikI^j$EiWghPJeldbo*rZ77<0IF>yqV2EUD0g zuSjnhyDhHI)(c_o^qOiruhD}!G}cilsXyuMNr}gF# z{g__JM4`X}OkfKBAv9RMA@gS`-`&+;r&X?2x9f$h6nj!LlkiL_-&Z*NjkrUJYK%T( zIJ(*Ia_jKm@Q1M;i_tVgAd9F->vl=mGn<~lot|H7f*CK7LWgN{NDz^ zXrFuSdYXyP9*@0NG+bR?x^2w9BI8uNGNwLmZ8c=cEmfbt-0NXYA73-wa9Hf2TY+Xx z%Khi}qPoTwy|5@3gwi_EA?=iiG#&Fz%)vGxEyNq9tN_QfuzL0raBA}u+@UOylE0@q zs8V-EO+DtBD&_5Zx@><(U#pMnBY^{4f=N{A#WyWPUiA@ts!0hTsm`pbZpwf@ z<}@R>7PJR&`|nSM$Y7${eCMu}tPZK4hl!g4V&r?125oI(!|Nxh`=q%6eF15Q@QUyK z5k8a-s&2)Rn>C~+6Yzz>>!C6hlf{B@H9pk7oQi{9!8HqlwbFiSHI6gxjgHcv(8COM z36_yY?|*;7@CQd$vr^?(Th@k?Q;pWO%3O9fB3Z2mDPZg8C8sjePMx7_N#n*uT8!@* z`%Kj>%OGWP2nLjGDS1{2Fnd8d1@eb9+f5_zwGmFuW3t9mgA|lw@)PsmYCr1NZ+gFb z%IIIQoY^LEuNcC^Im*Y($aH(7n93?&I&&5k0L)xV{U-i<|1%_Vzt{9H`(vSnk-UMS2s9S&}yEl-f@yN7ng zh#D4La;=9eX)&{oN1=FbX_hYKEj<~o0D=JY5Y9x)MMS69i+GIi3{u;3i&r-;4LXwP zPm+Ozmqp{@zqmP@uAR@_CymnhW^b`t;QhgvHNY-Qe8^@sGpUgR=#Dcu4M=|{V+#O$C33660^xE{*`KFP}L&LH6K`wwX zR)`+*d>@hnbAuAJKA{a+DkU?ha~t*`7RK0{k`+PK7$|ruv@4SOn?h4*6#o*9vvA9Z z4q2_@`Q8#Qef&~?Lck3d(|_*J1lV>qJ;IG=$&M-702+^B-mp3X9mpk(BtQMgg&>va zYwcr3G25dlD`9JBYRuEKBRrG}F5kjvRc*6P4e(%|gzw=6V&}yiF%8+&V;2vAaUA+N zj=oV@FOdQNKa9?6^ZaY6r-mu*)~HEfTRo1FHg5Xz9HeM(gf>J(yNoOvRmZGZ^Z>?y zORGe5=}zd}0a9ng_+O3pZ6PfbnoZkW0~YYqf$cjkJcgc{jM9H%TN*n05fXE25|Jjf zpWg16{JEbZ8&0~G&ldwasb1)R}R+W#l}CV=zYYC%BOdN4{w|e^pe*$dr0&C zy!(9Vn+29uNi3JG7eeh+M2z0*;nyetPiHKl0w*P}r|m!=iTaJ|T64`!X zJ1By5xw1E577h^VcPze(43 zhRIpkWuiy8otbp(II&|ttOGDWEN-W)oDPLY1^tjZj=-N#Kz!pxi%Ju43fr_lsKdpk zu|&jX+~n@m{7JIS71d1_1OxyhC;cZQ0#)PnD})ZX*f9|zgYgPHHYzFW2~KZRurlP zlSSjz>htsPp8Cf2#avxwlp~|F^7_4^4L6W)+dWqUF^`>d&NQ}_IYy)3YG+6 z>zX%D{>9#8Yrp`Ycb~NKrGVuUvp=6Sw&O&$5;)PdW|UdNY;9nnoN6T zt2^G2eW$3cs4+Kv){u)oF=xr4N65FgCC%>iJ0eQOn@k@nGS%TGg&UvG=t zGrkDfmG{;6R!)mZM|xL`j^%~*}XxQs%&3+&nzP;M}8 z?OQqR)Oaov0w(VtQw9wLcF}9~Bf>k9cKJ)sPU-GpE}(|VK8xj8!js33I;dtDc^qEd ztKxH7cMB~;h3-Vp<7=;Rj#rBKCNb7C7DpuG6EiN7SF!-l|XM4D@;KODQg)Uf}{Q*RrdbF~y8m zsE{q(E4iy!ZcqdG_ahH(PK;)u?;}`wvSDnNW`!eC#n?#m;o&nEW2JkOYfLtN6NT{f z9{NvgPQCg5gH4hpMekv6N(}iM|Bd-sO6hBZ)?3JCT%?OjC4D?gC74K3JpF? z4I0RTkYVJ`V&5kKi37;fm=#5=fSh6kHW=Wob5~GOZ_QQ_wk~o_CZKQHXJ4kvH4JSO z6)w4;VC8fS+$)B+i%yN1h`Jz%Ab-Wlk2fHWV5DFy0iUxp`yF7%K!+DnJVyaBDjc0D zbX7hiWA5`37^W7;Hzb6F8bE*AlF$o~*toVEladRxBT<(sPBtZ|RO=?Qgb4;rqO6=p z)wVl%P{chxr+5pDF**Ln7)ufxJ9y?puhpcF2F2pEm@eAXaR2d z1E9MTxpQL#25EeD2S(TVHW+3avvk892gn|saNYNl?h^MmP%eIg#60_Ro(icbUcWa_pOQ)c9l*|Kf}~KNqJHPhQ@uIt^A8QFEJ}5ccJYW| zYjrTufO7vtL+ux>5A1nb2j5p{&=SQ4JSZiTP!MTN$jAk!>pK66F*H^r&2F@R3l81g zwujVcTi*x{-H9nB1QQ_|c5?G+m0i!J9x)FVNi$!CYbs8p=fdZ)>3o~>k&icKR-0kT zx;fr+SN{IuMi`^&u=Q+4r1?v-gzA9i&JvUdhcy*cHnEy2wz1kId6b3ksdV|2*C+&| z3KVP}JC6zsQKvOF(i>NpD=q0eH%lZLdNMK0a;8xfZW-ZE{Hhg9)CH}Nm<}Ag^bjFL zK0qp~_?JFyZ{RP`jy%0PoTqW~fDAp^;?oge-~cW{I9Y!0+}7ty*CJCzb`BzeRB+I8 zNgV*_U4$>hZ}eb*q**5CV#3~{@~g?-i`6V(lqx)zSQ8~&--O;a)AqEW?jA8)s%lEp z@SuyL!gJ03>iJ(9+ieDWj!shvK4cMCD1;a0Yjp?z7O|_T>O6xnm6$=dKL*EzBhQVN z>sGAXYP)EzSBq25zIw7DgyLzjJmYYn`oWaF?A830DkDCJR_=h4l3Q~pxSjO;&f2*O zS9Z=_szT4Y<5BMBCqYn)j5|nOMpWA$X; z%0SnQ_$`B$R_r+{gO)2j6kn07gKoh%Gy5_briPF>j zht<90I?tM{HAUoa9p@SEzl?gvDjb*K!S#PFk$7u&A25SbNB8y%Cvr=Kb5OwRpC zuyY9+Le;!Fgv&q|9@4t(q93bP^nAm&Nnl4T9Dx3ix&Cpm>p_sbn$436!RTu=Znc~Z zdf;MrtIYfgX1Rpc%dEmmY){NeP94?k*Y%1L*5DA3x)Lq}WZBuc9h-G6o?1Uka}(VO z^Z~$F-|PiecI@aT&Zh7Ki(|(c&;PWTvEPV8vO z@-cjJH(NMkfn|Pi33f+K5FTCz@@oLHPCb^yYjBKC44&6fKqL+A-346zY)4w0BuZbm_jxZSj>|zUCyplu%*mPE zam|?7GkPiMU~b7BEhh&ci}om$jY8j)!VM<7I1=3Ob)1~#=tz*_`cg@0{?fP$mb*?+ z-%Flubkwd4`PH0kP4~?Ktd|vowZDo%gwSn`wNKn;&ALGu`-@TDxA%owacE6t5C!dt z+1rzCZGG41S-yS^aP?07V9<8CGioxdHblfhJ*42!;h7gG1I$1V&vgwa=5){0o=g#pqjN0L$ykZxE4>k7F~EZ^^Xzru?y3>DYJ|MT`FAGY&dR5G1HYGyt)XE&!Gkm*KW0BRORuczk1PJDlG43+>Lh&=$~K|L9$ z|D@vU`D0Knuzl!Db-2D$+q5+`&N^GUI_8!NDUq)X+p&(#0ZnEtt4E-L-J%}8mJzV8 z4pR>jlwBtqks}&oFLf&SVHyr4?ljiB(xqiPxjF%_-f%4qvf)s#+SGwQ$p@2^jYkkF z-C2&o!K`x1@>i?ioe5t>q%k8BFUnte2o36;>T+q$^=Q9o_g5tXSu?(6y>kd8XrZ31 znhT#>>eqj@WOKn%_sp*`j;RB;Bk;M>HLGcV*Euft%qJzV$?)qeV%FC+oipEiU7AKUYs* z0|Lln!85Fkd6E4b;4He>k6mDNvMU_9OCy{Kw-faW2qDkg%irn-dv=ucUTh0tJVGkw zD<^1M_}9=adE}`X@-h5|XZGv4ph;zf*}(Y1<&a6~)k3Hkb<49%RGQa#Bx)(LJ%k;< z&x4i$x;vCj?2)sIU8pWpdb}CI`$|RPF#%?IREKuO&S$zE1$jG-H!*>oaz4h zOZpxT!IVMm5H8J^`qd9p0R-)QEf|ajgF#6)6bHCdByXM;*>G{k-KNl7_{h9lXWSMB zv5Ko7kQK5BY8b4*f{I78mGxgSuOq^Xs--3I&65;r&lPHef{D~Lurg*^y zBP6I6*N`@lj!NvKfZFJJzGw3oOwcmMDm5{spkhz5%Vvx+I z9e!TcmpD#{L<{=j44_u5MrDnTO{SzyROmWqIP;&3W?lWI%-Z~9iX_Kb z?hNmjSfW!V{p?yCCvwG}tIdPkx?06FY>Q*}4pNFO%U-xiKcx(EN=u-$C3iog&qWqg zPF(OYyu^Nc(R--?K_$}=sM0TK-CC=8#YT->DTCrjZ3QhJ+e zFDpuNG%a4XL!%27B7%*a}6QJyZPqv_BsiQ--z&ifn+P#4!|BV^mYTUEfwkWh( z@HvL}cZGhq4zgZGKK&^SroHF5G6XQk9IAMNBqTi|fBwx>fww)S#HG z!>)F>t(*_H^o+VzYiXRhwAUxT>lq-dHEm9m5zXU{5PCm$EoLCE&J{q_NwB5P!b#sBy~jePzUViTkyE zmUdaJce8=^!))=8@3#gP(kC?st0tdtb}ZXVBkWH|DOpI+Q2u0Z?bbXxN+MfKx+KOm zs3V+Rb<5KRz2}j(fTf|Fd-af1mwS_VwqZ?DGgG*X7InIm zFnaA>&?s*{h}=i^eR-n~Q|L9;ZC!5u%(eKI)?Jzb^l20TUCPcwl~YRyDQ=*r0H?%P z;NHwIgX&BBLE2Cwm9uh=daS9=0U)Sbc7iR|+OqjQLWk#}yZF80+%2)4-rYnm-!pNC zX+09{GfxdPmbr^GS$XS>zdr{xVT*LUbH9e57pq2+!L z-r12iK8mV&T6`*(jCs(UbQ8HcZ1G39kRYY}qJYot)kt+2 zDetf4gaKndSN@rJz(5hvJg^y=k%fQuPCO3eARQUUsr+>7)V7tRov`i;U~e+TYrK$g zGUQsfPMl7t1@^N%kdGNtrgdL={{3~={pz?Y*oK*C0(TWM*@_df?U??oZ5I?pyQA% zS7J0~0ygNs?I)nyk29|qAx*WFOp6dCdwd`4cm}lcla&G0Bv)D!^ff_&Qk$l!D@gjl zB{6N6n4z!G>4!GG!wQlE1>vF+B^Ia;fTMPX@&1~*ZW&P64R&IINROhs7UktmWZO{& zRyi4%`O?&&^xy)W^v)Fh-rZ|@_35Wjr2$@iFBb4$0;qa4PGb^Z;$yrOcKouK_Xi_@ z*Rr|%G{nF0a6U+H%ua%URV!T_?D$w#&nG3(5eER!-9J9E1fcZnl589mWC`m2)Bc1}aei z;3^ewgtz%ySYsS=(<*NwdF3|3U6{3o+aNPdKG6iZaek`>tSX`#DQGkVf0j@G-s-p# zRkv2NW5qIx$!B)1{!7^bay@jwQz-9?%nx#`*pI4zkgBA}s1l7Kgbzgh0}EJ&Jg zOH_7{q?R7=Qpfp^a-gY^ffo4bnS*3O?S)W2N$=w|Brds@Uqaz5P4Z`>gfF5X0P3iE(s=%P6y8Z2K zz=W9ylJX=Up?wmY%Dleu#zha&Bp3aJJHN(B00|5B5_@L|&!uhI>b2Bza>bbAQDacN zXh*5^7MEMONgYW`QRQs|8pmbeA?p5Kbbbf-tA0?33uxfSX|A7@y1pIsHx6r-ySe#4 zuU`Z5!|yIyYtU(z;TQLxIVil=KO**`?$vW#)=02ra-- zeKp>Gsh+oF4taiwf^^Uz*d*(8LqGBMolN#*4Rz6AAb&p-b(BGFccY2!q&=4@-qPQX ze6hHw+K5E>X+%8UUwRZaP+V?w-%sn#l*<5Ds_^-9y0*@h3FDd@u8E3VvW%mSm#4(o zU}Jc@Y3@bPL^m~jo-dSgJtGPPbEu3M(8KaA6xrI}vI3;Mr1h#os;lSSL1q#HMXEfd zF;bFpuzp|4Wg%M6{|t;H4?2>IX-d1;t|PrFTccM@aLYyA6|5xVAoG}7iEL_J`)t^F z58ME;_hXy|7E6`o(D;ZH)Px}xPoVs%7I$<##2^1)@gBVIo6s@$`=evd%=S9~E>&iJ zx1Uqhh#+|u@wPoC79R-mp!Dh#(|CN4-#IGHrYUx<@^OwjlYK!c`eQaRT@K~Ke(+ys zxO{HuB$;3xIL@K*Omt5OPj+r(i^Cls3xKh^YUcsIJKF0xA%Tk%=UOm4D^)ytR4p@wdG(i4cp`lTS zxIXbQ4B)T91TL5K{=vGE3%hkdelWOjMU8+$ce7DoC{3B9t3v-iwzl`I0Ow-qek~=$ zy2Jag9k5og8{^Vdd43P#>EN6I4mHU57AWYXNKWk5SZjxilyqg`P{C7Ey+qJ4MS~v{ zUD}?3qPWqDrIls77XJv^6+6puz@@XH*R6RS&QT}zS6F+Nndkl5-aDB6*$Ozh{PYUH z{-=*~iDb>rMg;xObyv*7UQvrP?Zk!8E|NPXJq3Q}mUjdR>p>t0o31I869RKk%@&yZ`%9e%7 z8?GGyt^jGzgrU2U_M~d!St(1U*nd{TbD(f_JZAtsCRjW*0Uvf=+F-L4V*EA89xHk8 z>TV@L>O6b!X=`+ag7J+vKPlM802isGJ5Vo+5}?+&yfea20b>-D?PaLv()ySm)Br|9 zy3ZXTBWgg$wBDOfe_n|OK~ExbHF1-r)X_mq+T`jqTX@5@tB_Z>&#XYmJCb$-NSTF0 z;E+ibgcClB@W&|RMWfeOEe`Y|1}|?3mY$%wfIwgE);uVz(isH&P_H=J5|?k36PUK; z-r{;D7jkJKLcVDn+$&%#Rh!jw$qCr{?coZRei8U^v#1T%2 zvO>IB>05&{)f`R#Zajv41A2AgwZiO+uwct+qhM7(5?UZ(!tY`^&OxX<#mQ`4Yg4&x zkNgfYm^{h|7!E=2%zTD3>(UQz`*z2b2>kb~dcL`~1{`J_AOJ&U<-}=75k>?0`;^O9 z^qkCNK%~|>0bEa8kFS@o54NWBsHytj#n$+XIe&R@n_k3_hR5}QbhiK;R9PWFC*|K1 zpp(9;1Ne};14ZFOmk_GXud;kL*Z^+`KzQAh5iphW zAZk{T8wCK<$-_?4py(>g=7H2vmAfGI3jsE5on*WH6uswTt(Z-DmIVqM1WxKYKJ(3Z z&wlDi5Q_D!PN#RR135n%xdHYg@v`Ze6a~v>437dBjt8vd%2kYU+soFY9i~50(5!-IoU%8?-bIM8zM#lp_m{w~WD_LFIOtQy`ZM zqI-H-JQ@-D)cmm)2XzwmWj%orJ?6gQlSsZ!j`HErg#`9u*8cz`;Msc5U#JU+3Fre` zlcY&?RU%kS7_Hy*KfiL5`qA_C&_W=hX=tyMZKrX9Od^Da)x}BT)7=c41V_n$cYz0d zE6hVMRbbywOzTE~{FX~w9#i%twN@Rr2$3BHc*X<{gwn`O)9hV^55_um<>XLxWyJ0U zLNW>E5Q4F_b)umfZpel3phfJeWdt?w!Ipb(|NVVt@IF|_mq(5-+AE!hRjun^fVA?K zcW;=lA~pY%!)qB9NVGgOa(|ve+VBpsp0-{8eHFeQIkZ^J0^ln48UZkwS0aT#@CIj z<^qpCeU>2(Q!)PcHz!Jz-|xbbgh^FYqwG+RBLXner|-aE__O21x&IqP z$0@?>5C2?m*Thq6D*cTjQsEjkxVw`bg{2OAf9x8F3))spkBLj2r+4;$S?DPA5Pu40 zY4^`n{*JE=#Bc@)s;CKBcQRvY2Q2YNk7&SaPjVc23~dWk)1#dx zfLepAomH_IJvXSk1=jR00d%sbvK}C5NBcZ)rxdwZTEaTk(^1d@O;`kF#lE9QJge&0 z(K&(89)-PAT)#JX(}YFAntAzXR0c0DtFMmkp51VIU0esO;%l}gGFewIH8j1zv|T9C zXzsX;=Xu=T_73w8CBw&o|3O~I&=8Ex-D!Ym1^RoSVBbW3PIGGuFKB3dA)aVz;q@l) z7udkh8BU0`z6Bi&I~KuASAy<}0bVXUU};c`RsqmE$=o4R7*8BmHE_qjHVt|>^y18h zdnW(^_U3y) zLlP2$fgIpEeI>~n@o*xJWVvh=)v)b}t`MvPczQAry#AU4#xdG*+v8fTnY`Q&uy+^! zS&(-HUr*_j89?WmdAT~un)yQ`N)vn~h~_mtKIY;Wyf&zVik_Ym_Hn{&gn?!}Kg>yY zi{w+{!gvk%F}(f4VDBS61CTpT`nS8!aRUF*r(S)|C6~5?IQ*xEUZy7Wb6)9Ez;t$^ zddBjXT$Pk_KxPzXk_EamqM}>mKcoeUsKC;mkAATQ6`M8bWrL8Z=iz74WbzEDXmH9^G&9{Dh)nd+XFt=eGtOMo1HdJm|RS17XDiu`2 zF>3&v>j>7RN#5v}tJnskM?8A{+S?tE{(6?v;BeRr(`r`~LPWwbpvi*{xY*>Fx@vp= zDQ1#^Hocx1e+)-d6N2T8Y7UC#T*aOlcz9Z5^TquIddG-MqrTIOfnFjz(7>`WtPFr{ zlN<^5E1koKzDU#jR@FxQ-~C&;aWIgx85Z3ETlGeV+U+*(KocFFzCz>69X$TO7dMahYZ zq2QJ+x$hesq@gF7f+x*^_LVf8>hsf&WUe0-XEy)y|DyS7o)-4wvhIQ-?i#2jicVet zjW$30=HO=Zmx73qd74o-cEljH>ny&9Gz~q(MhB>l5j7bbp4dx~g9J$qo0=`I?Dfs*Dix74)hB6o`a%ppJ3a zW%a`c-a3szt`=)V^Q$^A*3}@>fV|NR{3v;8Yn{8t_JD~L$Uo$=UVehCEN>inqp4O5 zmU97|<)%j3^X$X9WPn^e0AycH6;~nu{)MS2N$O9~(h>OXct1}I%`_!a zbUx7hT>ms?D#t>BNw-z>@g-#9n_=%RfgLOB0?_T8h}21mKQ!6)O%_VLh+AH z%9y)#QYvVbDHmOHAkdyx0zDT%qfZi77B=Zj7^Zy&2)gi{Cg|&XQeRAh4<-*j7`l5j zt0f6_!|N$JSo+7an>dK?9Rwy6zzvIc%hR`?C_BF4o}wbcDhVwr9ixb^(VO@&QDD8h z0w#EFl#l5s{9urXEAvnXfK5vp%R{%G#13K@BvQa~1T0BHgG~ z_I>~)(t#DmTl#$RuB2)gv2DO*0QgO)|7Cuuy0^|Ey5ZCAg0y-N!4236v%LCvN(59941DV|+Zxv7$qS5#(`0#crM(YlU(KF}*WrU2e z2;9`l5?cmP-z`vD9#52Y-9_u^tdxEPEx~xO1a03g*__A+yB~dkhNsv%IJ&+uLhbTZ@7~}$9*H{)cZ$+jDhsya0se@&q4uV1w^wq zHzIWayju(En{cwkDQl(Xu)0b+N}_}V$~brD0Bc$>e_s-gJjVMq0l8?ymWOnpajXVw zdK_!Rq$la-9938Kz(@7S01FrgozAz77aNhW5JEKTxLB1m)DK}leb8M0HA`pW^RzN9 z^%)$<+rzRUD>2{$vZgvHfN**ev z#PqdM2h3c_|DX9`j28rC_G5!|%&;V-3Pavh|2Y{ysv1wAh;5C|rb%IfPO%?`EKY#x z&W~|T9=p@^X)}H68vrN13iJgh)A1`^lj*zGG6<51XKO3WL7Q$sG_hZgCI7!16e0&G znk-xDY(58Kz10KWx3aq0hk@JhBQ1S893=WaC?G_ngU~=CydZCBsnc;)o*=pBUO&IR zzM`617~;vI^JDaDx!ob$V^_(h+y@Cbe9;1d?=uwxW)jGNK7_hUZkgB!@YbMLZ)>}b z#zENj2#g{)$?CU{eo4>`duTIUq6UE`!3EIDbB(|oAC|S84*m_K8lBE_GXi*aIvNLH z#>=G{{JzOlGJ>eHM%T*BF8(ci1p)S);40`bW@b0nrMIEPK*d@{yWpxnT@Za*DSnjn z1B|8C4tnS&$!8lOa;HpU$~K_04wx$`Z&VguNx9N|eF57H?A`S^C3EylB=pSeDF7|!=zX060N)4)pAtZt?e@EEJR> zF}xc5+6~}I6@dPZhU2x#-s_JW;ZISj(!=TjBi3)SK&<|IONTuH#Azvzllj)97LrZ> zc9J$KOSUa}i*oUt$B1l!eFg584C}^U0@Zy1DMp{sSzmKhlc`z(9K(?>CqW#=l7JP2 z1ETU|yEte4%TT9S5R>uwlXlkSN3nK(lizeIA&+ndihrvCkME}@|1C#G3D~~`j7IVQ zHry*0gjzl04**h~>pQ)6*aGkfUluQcFpXu;`{Cq$6?BxcN>&B3($(cSv$`*Pw?cWU zazEblOpeLZiwy1Buu zev%Fvyo7+nb_p^|5U%Eh*EI6Fi1fq2nZMi3ajV^_$a+4%qn#J)h`G*EBjfy7A2XJ3 zarEXcU<>TjG*01n2t0H{pL8H*;iEOVGo({`d<)V5w7+iTLtq`PyR57PwZTWI~aF1}L zJ=5`9&@h;K1^dyUoz+?wuyF_Bjx8Fq7a!D4?v*C)%m4lP+%0@K={mCGl1L%pt<(7fts&?l3 zU#s&fsYvTpwNJ&C6K=RMGZr%cd9L9>(%y5Gt7o-g+Ib3S`wPJwM%Q|+o#Mo zU`|4@S;2QiA!dW_Mzni|fU{DGZzyYx?~^(OCxp9AFzSkkND&nVkxh-9h1Zy^_NNq+ z$orM9j-qKwfdi<43|x(j^Be~|n(1-=3*sm>v3^++S=`7!D=O{p(2`(p{UGM= z^zB|b&DQ&)+aL7}&{7(92Jp_}f^N6=LZyy?IGOIOa}}3V&UbpVO&87$t9U;n#^+eXfigDK6`EBNgz4S z?Q9v}2Dz$@ZgEM}D87Ndt7dt1nRC$cAD-YT9WN{Uw(n}GeD!((@ya@37Q-N@SaO7y zUwGVy(OEWN%V!7Ty&BEPPtSFv@(ic)96~0k76=07p82G7Ouw+%?$w$>zf{9DYeajz zLV{{_t8i4$mXv0P zw$tPrsUIiHjz;H7WRWSRF{2MI_TlVbiI&zJW3rBoh)chEJEZ{*j@AO|s>Z;+QpjYl zk7HT2*}Taeu>s;*h>T$vAxa?&{HP|nZL!2Li4VhfbZ7e{qm=s)g5gL>j-2+=A6}a6 zj*_M+9E2n7BQMum#EHkZTG5G2*24kvZTIciC6$sIB$4~<8Y1b_lUO0V@g(Y`9UT(E z>Ok85`%R)fo{a1P^LeZ7v}_)Ho6Dgc*>iZ-6G!UTeD=ZKVPcTmJ(}ZOEl#NuK7Dq| zoehR$Hjygi7ZeS^13}D;n!El(Y@a&q6U21{Lqf~(Grs?dgd!9m!qxja-hsBNr8puW zNtVZmy3nl4soaK3kY!V<8I|>tH#gZN4|(2LQbuQ)BQA^MI~XbOADH5gtv{{8>!Lr? zD+6^LZI?STMkP3!M&drtnL>t^i*DvK6EfHBs#fBh1+nX>PSWaJ&h&ImX@!7u;x&Pt z2ihb-x*R48&SgH?@11v30f)f%3>}`wEoFBGw+J&JR zE>xzDbvK@(`OpCX+ArZC3cDPf&LS^+>kLXdrpu{0Tt$)MXoa+$d~sv=(9t)YeR#z~ z6U9#GbL@*vv)rj)_^|53Bc5*8KG$8nDt@*Z@uR-V=8>%}SvY#-3pRrumbm&t_3MSS zHudiW4&*y<-di=XRzYxp+ZQLKcn2I6 zcC?SLgz~mMPk{MElx`z}=>%F@V<@B?IeuCJypr4$-wM-tqh3_EotmeZT~<;&e;|)3ehBG0S2_?+|$*$#JhiEMhv9E`Ip<$HWv zD{;5A7WyBbrgSYqeAPl#DJf68A1DcMK86YvFjl??XQt%{PC~T)KG0)luv-KwwH4Jc z+B(icM7OuCVPrKk6JZcQVDK&q&nkBT9X9$t3YMe%aX|T0Pw!j|g5uQj=ZJa%XND3q zv?u{(4)z$~-?xE5$T~riUH#Q}Ta;e?dEjk8hPw4L6~jjZ#V_9t4nFz;V?K@al@Qo( zfUAPBMg|)@u=jJ{Tqdj7X}F{(r^MUHBv{2#s`q* zq`uhogrDZF3+TnEGiXrZ@FgE5Dtg3<3Pq!y^v8~z>2X!#!!@^ZPs{n*olWms zv*=L{xu-_5j!vdJjpmadXJ5h2`$Hj*U1xb+-$f96#I*L~cZnk%nQn9&qH`v%(Bus0 zDI4!IbJCjbFv7MOA;_9@wNG^`9ue(qEZsqzLoK-Q_H2!GJJf;;=8kGD2JTp%JBbuh zkJptPZGSOfbJP_GF-E1oEaWRcS-KPTgc zgShq2wIqsIN|}k$K~|?I-iC4C3nuI-INCybkU?Md65h-#(-}`QB=rql_C$Qk92v#yl6`m|TT*g<&kft+F5^Bh3~dVLU<+cM@E8 zS;f#PD?q4Q19olf00^2Lx7|G0%umM!o!Fh!W3i1el>1ZEJxiGhs7ixfz_6d@A*2{s z4N;9<;So{jKHCTmqm=NfNRN}5K$}?x{ap)4?pi;BYh&45mJjucV+J#cig+ftu9jc6 z*hFv*k9yvxQ_KWJ69B@hrg^WUYqIFZA)t8yT^@xUhh=74bay2Op1Ry)uz8_>1Qb7w z{9u2WzuoQ{>dJC|VwT*0!$y|WFV+IITU#>!ZGf1W~YCSE=>=x=COjM+MB8(1;L$T#ZO0Rv!Augx5J`^ZFMqolP zEFPh6(MEcQ?VmuO3M8qAV7JBY&Opr@uZ;*Nv&8Z&kh0wi>P8r*(*?no;1Zr;i_T&D zp=+7ZU<3M;uM}dvi|S7?-4{-!mb}CI;Z6F%^7V#HX*U$1nDPmR>7xam1eMk9AWRa& zcEg%-8_buaZa(#Puo1E)^a3UWhBYC6Kxi_Gwm^AQY!xCeUouw$?-LJSctahAz%UmS z#n_MH9Ln{YFwt1u`!6!pKLwbIx^K#!yqhinaX}pEdb_X-EGvpJsHc$<`qDsXE4B)O zyE~7*D%vlNyzgo-vA|XGSITv!X3VJ9lUfE?^$t{ZlGTsp8j7OIs`UWEXK&ZW#5Hb$ z!+>EcVf>WQ$KSa`N?sUdt@M-s?u|O){YL`=(@)Ls_}v!*9;tfyo$zRYvbq?y#1$cg zkAXb#pVtRYZrlNp+lkHS4=*R?j4JgJZVnZPReFEQEgU(gD9-jj_Xbsa`z!T^vT=vn zluRraWOjb<`p=fp-)rYDv9IuKtI5(H#jT|!uqj_tWqK#_x}2=egZ+ew6 Date: Tue, 6 Dec 2022 12:44:11 +0100 Subject: [PATCH 3/3] edits --- docs/introduction/core-concepts/core-components.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/introduction/core-concepts/core-components.md b/docs/introduction/core-concepts/core-components.md index f6ea4bdeb4..45fcc542bd 100644 --- a/docs/introduction/core-concepts/core-components.md +++ b/docs/introduction/core-concepts/core-components.md @@ -2,7 +2,6 @@ The AEA framework consists of several core components. The following sections discuss the inner workings of the AEA framework and how it calls the code in custom packages (see inversion of control and a helpful comparison here). Whilst it is in principle possible to use parts of the framework as a library, we do not recommend it. - ### Envelope `AEA` objects communicate asynchronously via `Envelopes`.