Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,117 changes: 2,662 additions & 455 deletions Cargo.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ members = [
"basics/hello-solana/native/program",
"basics/hello-solana/anchor/programs/*",
"basics/hello-solana/pinocchio/program",
"basics/hello-solana/zig/program-test",
"basics/pda-rent-payer/native/program",
"basics/pda-rent-payer/pinocchio/program",
"basics/pda-rent-payer/anchor/programs/*",
Expand Down
3 changes: 3 additions & 0 deletions basics/hello-solana/zig/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
solana-zig
.zig-cache
zig-out/lib
23 changes: 23 additions & 0 deletions basics/hello-solana/zig/build.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const std = @import("std");
const solana = @import("solana_program_sdk");
const base58 = @import("base58");

pub fn build(b: *std.Build) !void {
const target = b.resolveTargetQuery(solana.sbf_target);

const optimize = .ReleaseFast;

const program = b.addLibrary(.{ .name = "hello_world_program", .linkage = .dynamic, .root_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.optimize = optimize,
.target = target,
}) });

_ = solana.buildProgram(b, program, target, optimize);
b.installArtifact(program);

const install_step = b.addInstallArtifact(program, .{ .dest_dir = .{ .override = .{ .custom = "../program-test/tests/fixtures" } } });
b.getInstallStep().dependOn(&install_step.step);

base58.generateProgramKeypair(b, program);
}
21 changes: 21 additions & 0 deletions basics/hello-solana/zig/build.zig.zon
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
.{
.name = .hello_world,
.version = "0.0.0",
.fingerprint = 0xf73eae910a007609,
.minimum_zig_version = "0.15.1",
.dependencies = .{
.solana_program_sdk = .{
.url = "https://github.com/joncinque/solana-program-sdk-zig/archive/refs/tags/v0.17.1.tar.gz",
.hash = "solana_program_sdk-0.17.1-wGj9UBrlAADAagTi3MSX1vSpGg-DePWB_5znbUgMlH1U",
},
.base58 = .{
.url = "https://github.com/joncinque/base58-zig/archive/refs/tags/v0.15.0.tar.gz",
.hash = "base58-0.15.0-6-CZmwVpAAAxqof6REya9G_XyHL1fTqUsAcsZ-J1IHMF",
},
},
.paths = .{
"build.zig",
"build.zig.zon",
"src",
},
}
51 changes: 51 additions & 0 deletions basics/hello-solana/zig/install-solana-zig.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env bash

if [[ -n $SOLANA_ZIG_VERSION ]]; then
solana_zig_version="$SOLANA_ZIG_VERSION"
else
solana_zig_version="v1.52.0"
fi
solana_zig_release_url="https://github.com/joncinque/solana-zig-bootstrap/releases/download/solana-$solana_zig_version"

output_dir="$1"
if [[ -z $output_dir ]]; then
output_dir="solana-zig"
fi
output_dir="$(mkdir -p "$output_dir"; cd "$output_dir"; pwd)"
cd $output_dir

arch=$(uname -m)
if [[ "$arch" == "arm64" ]]; then
arch="aarch64"
fi
case $(uname -s | cut -c1-7) in
"Linux")
os="linux"
abi="musl"
;;
"Darwin")
os="macos"
abi="none"
;;
"Windows" | "MINGW64")
os="windows"
abi="gnu"
;;
*)
echo "install-solana-zig.sh: Unknown OS $(uname -s)" >&2
exit 1
;;
esac

solana_zig_tar=zig-$arch-$os-$abi.tar.bz2
url="$solana_zig_release_url/$solana_zig_tar"
echo "Downloading $url"
curl --proto '=https' --tlsv1.2 -SfOL "$url"
echo "Unpacking $solana_zig_tar"
tar -xjf $solana_zig_tar
rm $solana_zig_tar

solana_zig_dir="zig-$arch-$os-$abi-baseline"
mv "$solana_zig_dir"/* .
rmdir $solana_zig_dir
echo "solana-zig compiler available at $output_dir"
14 changes: 14 additions & 0 deletions basics/hello-solana/zig/program-test/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "program-test"
version = "0.1.0"
edition = "2021"

[dev-dependencies]
litesvm = "0.6.0"
solana-instruction = "2.2.1"
solana-keypair = "2.2.1"
solana-native-token = "2.2.1"
solana-pubkey = "2.2.1"
solana-signer = "2.2.1"
solana-transaction = "2.2.1"
solana-message = "2.2.1"
39 changes: 39 additions & 0 deletions basics/hello-solana/zig/program-test/tests/litesvm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use litesvm::LiteSVM;
use solana_instruction::Instruction;
use solana_keypair::Keypair;
use solana_message::Message;
use solana_native_token::LAMPORTS_PER_SOL;
use solana_pubkey::pubkey;
use solana_signer::Signer;
use solana_transaction::Transaction;

#[test]
fn test_hello_world() {
let payer = Keypair::new();

let mut svm = LiteSVM::new();
svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL).unwrap();

let program_id = pubkey!("11111111111111111111111111111112");

let program_bytes = include_bytes!("./fixtures/hello_world_program.so");
svm.add_program(program_id, program_bytes);

let instruction = Instruction {
program_id,
accounts: vec![],
data: vec![],
};

let tx = Transaction::new(
&[&payer],
Message::new(&[instruction], Some(&payer.pubkey())),
svm.latest_blockhash(),
);

let res = svm.send_transaction(tx).expect("transaction failed");
dbg!(&res.logs);

assert!(res.logs.iter().any(|log| log.contains("Hello, Solana!")));
assert!(res.logs.iter().any(|log| log.contains("Our program's Program ID:")));
}
12 changes: 12 additions & 0 deletions basics/hello-solana/zig/src/main.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const sol = @import("solana_program_sdk");

export fn entrypoint(input: [*]u8) u64 {
const context = sol.context.Context.load(input) catch return 1;
processInstruction(context.program_id) catch return 1;
return 0;
}

fn processInstruction(program_id: *sol.public_key.PublicKey) !void {
sol.log.log("Hello, Solana!");
sol.log.print("Our program's Program ID: {f}", .{program_id});
}