Contract deploy and interact
The AEA erc1155_deploy
and erc1155_client
skills demonstrate an interaction between two AEAs with the usage of a smart contract.
- The
erc1155_deploy
skill deploys the smart contract, creates and mints items. - The
erc1155_client
skill signs a transaction to complete a trustless trade with the counterparty.
Preparation instructions
Dependencies
Follow the Preliminaries and Installation sections from the AEA quick start.
Discussion
The scope of the specific demo is to demonstrate how to deploy a smart contract and interact with it. For the specific use-case, we create two AEAs one that deploys and creates tokens inside the smart contract and the other that signs a transaction so we can complete an atomic swap. The smart contract we are using is an ERC1155 smart contract with a one-step atomic swap functionality. That means the trade between the two AEAs can be trustless.
Note
This demo serves demonstrative purposes only. Since the AEA deploying the contract also has the ability to mint tokens, in reality the transfer of tokens from the AEA signing the transaction is worthless.
Demo
Create the deployer AEA
Fetch the AEA that will deploy the contract.
aea fetch fetchai/erc1155_deployer:0.21.0
cd erc1155_deployer
aea install
aea build
Alternatively, create from scratch.
Create the AEA that will deploy the contract.
aea create erc1155_deployer
cd erc1155_deployer
aea add connection fetchai/p2p_libp2p:0.14.0
aea add connection fetchai/soef:0.15.0
aea add connection fetchai/ledger:0.12.0
aea add skill fetchai/erc1155_deploy:0.20.0
aea install
aea build
aea config set agent.default_connection fetchai/p2p_libp2p:0.14.0
aea config set --type dict agent.default_routing \
'{
"fetchai/contract_api:0.10.0": "fetchai/ledger:0.12.0",
"fetchai/ledger_api:0.9.0": "fetchai/ledger:0.12.0",
"fetchai/oef_search:0.12.0": "fetchai/soef:0.15.0"
}'
aea config set --type list vendor.fetchai.connections.p2p_libp2p.cert_requests \
'[{"identifier": "acn", "ledger_id": "ethereum", "not_after": "2022-01-01", "not_before": "2021-01-01", "public_key": "fetchai", "save_path": ".certs/conn_cert.txt"}]'
aea config set agent.default_ledger ethereum
Additionally, create the private key for the deployer AEA. Generate and add a key for Ethereum use:
aea generate-key ethereum
aea add-key ethereum ethereum_private_key.txt
And one for the P2P connection:
aea generate-key fetchai fetchai_connection_private_key.txt
aea add-key fetchai fetchai_connection_private_key.txt --connection
Finally, certify the key for use by the connections that request that:
aea issue-certificates
Create the client AEA
In another terminal, fetch the AEA that will get some tokens from the deployer.
aea fetch fetchai/erc1155_client:0.21.0
cd erc1155_client
aea install
aea build
Alternatively, create from scratch.
Create the AEA that will get some tokens from the deployer.
aea create erc1155_client
cd erc1155_client
aea add connection fetchai/p2p_libp2p:0.14.0
aea add connection fetchai/soef:0.15.0
aea add connection fetchai/ledger:0.12.0
aea add skill fetchai/erc1155_client:0.19.0
aea install
aea build
aea config set agent.default_connection fetchai/p2p_libp2p:0.14.0
aea config set --type dict agent.default_routing \
'{
"fetchai/contract_api:0.10.0": "fetchai/ledger:0.12.0",
"fetchai/ledger_api:0.9.0": "fetchai/ledger:0.12.0",
"fetchai/oef_search:0.12.0": "fetchai/soef:0.15.0"
}'
aea config set --type list vendor.fetchai.connections.p2p_libp2p.cert_requests \
'[{"identifier": "acn", "ledger_id": "ethereum", "not_after": "2022-01-01", "not_before": "2021-01-01", "public_key": "fetchai", "save_path": ".certs/conn_cert.txt"}]'
aea config set agent.default_ledger ethereum
Additionally, create the private key for the client AEA. Generate and add a key for Ethereum use:
aea generate-key ethereum
aea add-key ethereum ethereum_private_key.txt
And one for the P2P connection:
aea generate-key fetchai fetchai_connection_private_key.txt
aea add-key fetchai fetchai_connection_private_key.txt --connection
Finally, certify the key for use by the connections that request that:
aea issue-certificates
Run Ganache
Run the following command
docker run -p 8545:8545 trufflesuite/ganache-cli:latest --verbose --gasPrice=0 --gasLimit=0x1fffffffffffff --account="$(cat erc1155_deployer/ethereum_private_key.txt),1000000000000000000000" --account="$(cat erc1155_client/ethereum_private_key.txt),1000000000000000000000"
To check the wealth use (after some time for the wealth creation to be mined on Ropsten):
aea get-wealth ethereum
You should get 1000000000000000000000
.
Note
If no wealth appears after a while, then try funding the private key directly using a web faucet.
Update SOEF configurations for both AEAs
To update the SOEF configuration, run in each AEA project:
aea config set vendor.fetchai.connections.soef.config.chain_identifier ethereum
Run the AEAs
First, run the deployer AEA.
aea run
Once you see a message of the form To join its network use multiaddr 'SOME_ADDRESS'
take note of the address.
It will perform the following steps: - deploy the smart contract - create a batch of items in the smart contract - mint a batch of items in the smart contract
At some point you should see the log output:
registering service on SOEF.
Then, update the configuration of the client AEA's P2P connection by appending the following
YAML text at the end of the aea-config.yaml
file:
---
public_id: fetchai/p2p_libp2p:0.14.0
type: connection
config:
delegate_uri: 127.0.0.1:11001
entry_peers:
- SOME_ADDRESS
local_uri: 127.0.0.1:9001
log_file: libp2p_node.log
public_uri: 127.0.0.1:9001
where SOME_ADDRESS
is the output
of aea get-multiaddress fetchai -c -i fetchai/p2p_libp2p:0.14.0 -u public_uri)
in the erc1155_deployer
project.
The output will be something like /dns4/127.0.0.1/tcp/9000/p2p/16Uiu2HAm2JPsUX1Su59YVDXJQizYkNSe8JCusqRpLeeTbvY76fE5
.
Or, run these commands (replace SOME_ADDRESS
as above):
aea config set --type dict vendor.fetchai.connections.p2p_libp2p.config \
'{
"delegate_uri": "127.0.0.1:11001",
"entry_peers": ["SOME_ADDRESS"],
"local_uri": "127.0.0.1:9001",
"log_file": "libp2p_node.log",
"public_uri": "127.0.0.1:9001"
}'
Then, in the separate terminal run the client AEA.
aea run
You will see that upon discovery the two AEAs exchange information about the transaction and the client at the end signs and sends the signature to the deployer AEA to send it to the network.
Note
Transactions on Ropsten can take a significant amount of time! If you run the example a second time, and the previous transaction is still pending, it can lead to a failure. The warning message `Cannot verify whether transaction improves utility. Assuming it does!` can be ignored.
Delete the AEAs
When you're done, go up a level and delete the AEAs.
cd ..
aea delete erc1155_deployer
aea delete erc1155_client
Communication
This diagram shows the communication between the various entities as data is successfully trustless trade.