Skip to content

Commit

Permalink
fix: handle SAC spec
Browse files Browse the repository at this point in the history
Wasm files have metadata that isn't currently used by typebindings. However, we were creating a higher level Spec (not just  `Vec<ScSpecEntry>`), from the raw bytes of the XDR.

Also, add initialization logic in
`cmd/crates/soroban-spec-typescript/ts-tests` and a test to show that we
can generate typebindings from the native asset. Clean up `ts-tests`
logic while here, updating "soroban" references with "stellar".
  • Loading branch information
willemneal authored and chadoh committed Dec 18, 2024
1 parent e5454e6 commit 16ecdc0
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 19 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/bindings-ts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
NETWORK: local
ENABLE_SOROBAN_RPC: true
options: >-
--health-cmd "curl --no-progress-meter --fail-with-body -X POST \"http://localhost:8000/soroban/rpc\" -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":8675309,\"method\":\"getNetwork\"}' && curl --no-progress-meter \"http://localhost:8000/friendbot\" | grep '\"invalid_field\": \"addr\"'"
--health-cmd "curl --no-progress-meter --fail-with-body -X POST \"http://localhost:8000/rpc\" -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":8675309,\"method\":\"getNetwork\"}' && curl --no-progress-meter \"http://localhost:8000/friendbot\" | grep '\"invalid_field\": \"addr\"'"
--health-interval 10s
--health-timeout 5s
--health-retries 50
Expand Down
6 changes: 3 additions & 3 deletions cmd/crates/soroban-spec-typescript/ts-tests/.env
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
SOROBAN_NETWORK_PASSPHRASE="Standalone Network ; February 2017"
SOROBAN_RPC_URL="http://localhost:8000/soroban/rpc"
SOROBAN_FRIENDBOT_URL="http://localhost:8000/friendbot"
STELLAR_NETWORK_PASSPHRASE="Standalone Network ; February 2017"
STELLAR_RPC_URL="http://localhost:8000/rpc"
STELLAR_FRIENDBOT_URL="http://localhost:8000/friendbot"
18 changes: 9 additions & 9 deletions cmd/crates/soroban-spec-typescript/ts-tests/initialize.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ done
unset IFS

echo Network
echo " RPC: $SOROBAN_RPC_URL"
echo " Passphrase: \"$SOROBAN_NETWORK_PASSPHRASE\""
echo " RPC: $STELLAR_RPC_URL"
echo " Passphrase: \"$STELLAR_NETWORK_PASSPHRASE\""

NETWORK_STATUS=$(curl -s -X POST "http://localhost:8000/soroban/rpc" -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "id": 8675309, "method": "getHealth" }' | sed 's/.*"status":"\([^"]*\)".*/\1/') || { echo "Make sure you're running local RPC network on localhost:8000" && exit 1; }
NETWORK_STATUS=$(curl -s -X POST "http://localhost:8000/rpc" -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "id": 8675309, "method": "getHealth" }' | sed 's/.*"status":"\([^"]*\)".*/\1/') || { echo "Make sure you're running local RPC network on localhost:8000" && exit 1; }
echo " Status: $NETWORK_STATUS"

if [[ "$NETWORK_STATUS" != "healthy" ]]; then
Expand All @@ -22,28 +22,28 @@ if [[ "$NETWORK_STATUS" != "healthy" ]]; then
fi

# Print command before executing, from https://stackoverflow.com/a/23342259/249801
# Discussion: https://github.com/stellar/soroban-tools/pull/1034#pullrequestreview-1690667116
# Discussion: https://github.com/stellar/stellar-tools/pull/1034#pullrequestreview-1690667116
exe() { echo"${@/eval/}" ; "$@" ; }

function fund_all() {
exe eval "./soroban keys generate root"
exe eval "./soroban keys fund root"
exe eval "./stellar keys generate --fund root"
}
function upload() {
exe eval "(./soroban contract $1 --quiet --source root --wasm $2 --ignore-checks) > $3"
exe eval "(./stellar contract $1 --quiet --source root --wasm $2 --ignore-checks) > $3"
}
function deploy_all() {
upload deploy ../../../../target/wasm32-unknown-unknown/test-wasms/test_custom_types.wasm contract-id-custom-types.txt
# TODO: support `--wasm-hash` with `contract bindings`
upload install ../../../../target/wasm32-unknown-unknown/test-wasms/test_constructor.wasm contract-wasm-hash-constructor.txt
exe eval "./stellar contract asset deploy --asset native --source root"
}
function bind() {
exe eval "./soroban contract bindings typescript $1 $2 --output-dir ./node_modules/$3 --overwrite"
exe eval "./stellar contract bindings typescript $1 $2 --output-dir ./node_modules/$3 --overwrite"
exe eval "sh -c \"cd ./node_modules/$3 && npm install && npm run build\""
}
function bind_all() {
bind --contract-id $(cat contract-id-custom-types.txt) test-custom-types
bind --wasm-hash $(cat contract-wasm-hash-constructor.txt) test-constructor
bind --contract-id $(stellar contract id asset --asset native) xlm
}

fund_all
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import test from "ava"
import { rpcUrl, root, signer } from "./util.js"
import { Client, networks } from "xlm"

const contract = new Client({
...networks.standalone,
rpcUrl,
allowHttp: true,
publicKey: root.keypair.publicKey(),
...signer,
})

test("can generate a lib from a Stellar Asset Contract", async (t) => {
t.is((await contract.symbol()).result, "native");
});
6 changes: 3 additions & 3 deletions cmd/crates/soroban-spec-typescript/ts-tests/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Address, Keypair } from "@stellar/stellar-sdk";
import { basicNodeSigner } from "@stellar/stellar-sdk/contract";

const rootKeypair = Keypair.fromSecret(
spawnSync("./soroban", ["keys", "show", "root"], {
spawnSync("./stellar", ["keys", "show", "root"], {
shell: true,
encoding: "utf8",
}).stdout.trim(),
Expand All @@ -14,9 +14,9 @@ export const root = {
address: Address.fromString(rootKeypair.publicKey()),
};

export const rpcUrl = process.env.SOROBAN_RPC_URL ?? "http://localhost:8000/";
export const rpcUrl = process.env.STELLAR_RPC_URL ?? "http://localhost:8000/";
export const networkPassphrase =
process.env.SOROBAN_NETWORK_PASSPHRASE ??
process.env.STELLAR_NETWORK_PASSPHRASE ??
"Standalone Network ; February 2017";

export const signer = basicNodeSigner(root.keypair, networkPassphrase);
8 changes: 5 additions & 3 deletions cmd/soroban-cli/src/commands/contract/bindings/typescript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ pub enum Error {
FailedToGetFileName(PathBuf),
#[error(transparent)]
WasmOrContract(#[from] wasm_or_contract::Error),
#[error(transparent)]
Xdr(#[from] crate::xdr::Error),
}

#[async_trait::async_trait]
Expand All @@ -62,9 +64,9 @@ impl NetworkRunnable for Cmd {
wasm_or_contract::fetch_wasm(&self.wasm_or_hash_or_contract_id, &print).await?;

let spec = if let Some(spec) = spec {
Spec::new(&spec)?
Spec::new(&spec)?.spec
} else {
Spec::new(&soroban_sdk::token::StellarAssetSpec::spec_xdr())?
soroban_spec::read::parse_raw(&soroban_sdk::token::StellarAssetSpec::spec_xdr())?
};

if self.output_dir.is_file() {
Expand Down Expand Up @@ -94,7 +96,7 @@ impl NetworkRunnable for Cmd {
contract_address.as_deref(),
network.as_ref().map(|n| n.rpc_url.as_ref()),
network.as_ref().map(|n| n.network_passphrase.as_ref()),
&spec.spec,
&spec,
)?;
print.checkln("Generated!");
print.infoln(format!(
Expand Down

0 comments on commit 16ecdc0

Please sign in to comment.