id: transaction-builder-generator title: Transaction Builder Generator
A transaction builder is a helper function that converts its arguments into the payload of an Aptos transaction calling a particular Move script.
In Rust, the signature of such a function typically looks like this:
rust
pub fn encode_peer_to_peer_with_metadata_script(
token: TypeTag,
payee: AccountAddress,
amount: u64,
metadata: Vec<u8>,
metadata_signature: Vec<u8>,
) -> Script;
This crate provide a binary tool generate-transaction-builders
to generate and install transaction builders in several programming languages.
The tool will also generate and install type definitions for Aptos types such as TypeTag
, AccountAddress
, and Script
.
In practice, hashing and signing Aptos transactions additionally requires a runtime library for Binary Canonical Serialization ("BCS"). Such a library will be installed together with the Aptos types.
The following languages are currently supported:
Python 3
C++ 17
Java 8
Go >= 1.13
Rust (NOTE: Code generation of dependency-free Rust is experimental. Consider using the libraries of the Aptos repository instead.)
TypeScript / JavaScript
Swift (version 5.3)
From the root of the Aptos repository, run cargo build -p transaction-builder-generator
.
You may browse command line options with target/debug/generate-transaction-builders --help
.
To install Python3 modules serde
, bcs
, aptos_types
, and aptos_framework
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language python3 \
--module-name aptos_framework \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
--with-custom-aptos-code aptos-move/transaction-builder-generator/examples/python3/custom_aptos_code/*.py \
-- \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the Python demo file with:
bash
cp aptos-move/transaction-builder-generator/examples/python3/stdlib_demo.py "$DEST"
PYTHONPATH="$PYTHONPATH:$DEST" python3 "$DEST/stdlib_demo.py"
To install C++ files serde.hpp
, bcs.hpp
, aptos_types.hpp
, aptos_framework.hpp
, aptos_framework.cpp
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language cpp \
--module-name aptos_framework \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the C++ demo file with:
bash
cp aptos-move/transaction-builder-generator/examples/cpp/stdlib_demo.cpp "$DEST"
clang++ --std=c++17 -I "$DEST" "$DEST/aptos_framework.cpp" "$DEST/stdlib_demo.cpp" -o "$DEST/stdlib_demo"
"$DEST/stdlib_demo"
To install Java source packages com.novi.serde
, com.novi.bcs
, com.aptos.types
, and com.aptos.stdlib
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language java \
--module-name com.aptos.stdlib \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
--with-custom-aptos-code aptos-move/transaction-builder-generator/examples/java/custom_aptos_code/*.java \
-- \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the Java demo file with:
bash
cp aptos-move/transaction-builder-generator/examples/java/StdlibDemo.java "$DEST"
(find "$DEST" -name "*.java" | xargs javac -cp "$DEST")
java -enableassertions -cp "$DEST" StdlibDemo
To generate the Go "packages" testing/aptostypes
, and testing/aptosstdlib
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language go \
--module-name aptosstdlib \
--aptos-package-name testing \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the Go demo file as follows:
(Note that $DEST
must be an absolute path)
bash
cp aptos-move/transaction-builder-generator/examples/golang/stdlib_demo.go "$DEST"
(cd "$DEST" && go mod init testing && go mod edit -replace testing="$DEST" && go run stdlib_demo.go)
To install dependency-free Rust crates aptos-types
and aptos-framework
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language rust \
--module-name framework \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the Rust demo file. (See unit test for details.)
To generate the TypeScript "module" aptosStdlib
and its submodules into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language typescript \
--module-name aptosStdlib \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
To install C# source Serde
, Bcs
, Aptos.Types
, and Aptos.Stdlib
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language csharp \
--module-name Aptos.Stdlib \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
--with-custom-aptos-code aptos-move/transaction-builder-generator/examples/csharp/custom_aptos_code/*.cs \
-- \
"aptos-move/framework/aptos-framework/releases/artifacts/current"
Next, you may copy and execute the C# demo file with:
bash
mkdir "$DEST"/Demo
cp aptos-move/transaction-builder-generator/examples/csharp/StdlibDemo.cs "$DEST/Demo"
cd "$DEST/Aptos/Stdlib"
dotnet new classlib -n Aptos.Stdlib -o .
dotnet add Aptos.Stdlib.csproj reference ../Types/Aptos.Types.csproj
rm Class1.cs
cd "../../Demo"
dotnet new sln
dotnet new console
rm Program.cs
dotnet add Demo.csproj reference ../Aptos/Stdlib/Aptos.Stdlib.csproj
dotnet add Demo.csproj reference ../Aptos/Types/Aptos.Types.csproj
dotnet add Demo.csproj reference ../Serde/Serde.csproj
dotnet add Demo.csproj reference ../Bcs/Bcs.csproj
dotnet run --project Demo.csproj
To install Swift source Serde
, Bcs
, AptosTypes
, and AptosStdlib
into a target directory $DEST
, run:
bash
target/debug/generate-transaction-builders \
--language swift \
--module-name AptosStdlib \
--with-aptos-types "testsuite/generate-format/tests/staged/aptos.yaml" \
--target-source-dir "$DEST" \
"language/framework/aptos-framework/releases/artifacts/current"
Next, you may copy the Swift demo, create the Swift package for the transaction builders, and execute the example with the following:
```bash
cp language/transaction-builder/generator/examples/swift/main.swift "$DEST/Sources/AptosStdlib"
cd "$DEST"
cat >Package.swift < import PackageDescription let package = Package(
name: "AptosStdlib",
targets: [
.target(
name: "Serde",
dependencies: []
),
.target(
name: "AptosTypes",
dependencies: ["Serde"]
),
.target(
name: "AptosStdlib",
dependencies: ["Serde", "AptosTypes"]
),
]
)
EOF
swift run
``` Supporting transaction builders in an additional programming language boils down to providing the following items: Code generation for Aptos types (Rust library and tool), BCS runtime (library in target language), Code generation for transaction builders (Rust tool). Items (1) and (2) are provided by the Rust library Item (3) --- this tool --- is currently developed in the Aptos repository. Items (2) and (3) are mostly independent. Both crucially depend on (1) to be sufficiently stable, therefore our suggestion for adding a new language is first to open a new github issue in The new issue created on requirements for the production environment (e.g. Java >= 8); suggestions for a testing environment in CircleCI (if not easily available in Debian 10.4 "buster"); optionally, suggested definitions for a sample of types in the target language (structs, enums, arrays, tuples, vectors, maps, (un)signed integers of various sizes, etc).Adding Support for a New Language
serde-generate
which is developed in a separate github repository.serde-generate
and contact the Aptos maintainers.serde-generate
should include: