UNPKG

as-soroban-sdk

Version:

AssemblyScript SDK for writing contracts for Soroban.

193 lines (171 loc) 6.67 kB
import { Bytes } from "./bytes"; import { contract_event, fail_with_error, get_current_contract_address, get_ledger_network_id, get_ledger_sequence, get_ledger_timestamp, get_ledger_version, get_max_live_until_ledger, log_from_linear_memory, obj_cmp, vec_unpack_to_linear_memory } from "./env"; import { Val, toU32, toU64, ErrorVal, contractError, fromSmallSymbolStr, AddressObject, isU64Small, toU64Small, fromU32} from "./value"; import { Vec } from "./vec"; /** * Emit a diagnostic event containing a message. * To do so it copies the message to linear memory starting from position 0. * If you already have data there, consider using `logFromLinearMemory`. * @param msg the message to log */ export function logStr(msg: string): void { let b = Bytes.fromString(msg); let len = b.len(); b.copyToLinearMemory(0, 0, len); let zero = fromU32(0); log_from_linear_memory(zero, fromU32(len), zero, zero); } /** * Emit a diagnostic event containing the given value. * To do so it copies the value to linear memory starting from position 0. * If you already have data there, consider using `logFromLinearMemory`. * @param value the value to log */ export function logValue(value: Val): void { let vec = new Vec() vec.pushBack(value); log("", vec); } /** * Emit a diagnostic event containing the given message and value. * To do so it copies the message and value to linear memory starting from position 0. * If you already have data there, consider using `logFromLinearMemory`. * @param value the value to log */ export function logMgsAndValue(msg: string, value: Val): void { let vec = new Vec() vec.pushBack(value); log(msg, vec); } /** * Emit a diagnostic event containing a message and the values from the given vector. * To do so it copies the message and the values to linear memory starting from position 0. * If you already have data there, consider using `logFromLinearMemory`. * @param msg the message string * @param args The values in the Vector. */ export function log(msg: string, vals: Vec): void { // Copy message to linear memory let msgBytes = Bytes.fromString(msg); let msgLen = msgBytes.len(); msgBytes.copyToLinearMemory(0, 0, msgLen); // starts at position 0 // Copy vals to linear memory let valsLen = fromU32(vals.len()) let valsPos = fromU32(msgLen + 1) vec_unpack_to_linear_memory(vals.getHostObject(), valsPos, valsLen); // Log from linear memory log_from_linear_memory(fromU32(0), fromU32(msgLen), valsPos, valsLen); } /** * Emit a diagnostic event containing a message and sequence of `Val`s from a Vec. * @param msgPos u32 starting position of message in linear memory * @param msgLen u32 length of message in linear memory * @param valsPos u32 starting position of the values in linear memory * @param valsLen u32 length (nr. of elements from the vec) of the values in linear memory */ export function logFromLinearMemory(msgPos: u32, msgLen: u32, valsPos: u32, valsLen: u32): void { log_from_linear_memory(fromU32(msgPos), fromU32(msgLen), fromU32(valsPos), fromU32(valsLen)) } /** * Get the address object for the current contract. * @returns the current contract address as AddressObject */ export function getCurrentContractAddress(): AddressObject { return get_current_contract_address(); } /** * Compare two objects, or at least one object to a non-object, structurally. Returns -1 if a<b, 1 if a>b, or 0 if a==b. * @param a first obj to compare. * @param b second obj to compare. * @returns result -1 if a<b, 1 if a>b, or 0 if a==b. */ export function compareObj(a: Val, b: Val): i64 { return obj_cmp(a, b); } /** * Return the protocol version of the current ledger as a u32. * @returns protocol version of the current ledger as a u32. */ export function getLedgerVersion(): u32 { return toU32(get_ledger_version()); } /** * Return the sequence number of the current ledger as a u32. * @returns sequence number of the current ledger as a u32. */ export function getLedgerSequence(): u32 { return toU32(get_ledger_sequence()); } /** * Returns the max ledger sequence that an entry can live to (inclusive). * @returns the max ledger sequence that an entry can live to as u32 */ export function getMaxLiveUntilLedger(): u32 { return toU32(get_max_live_until_ledger()); } /** * Return the timestamp number of the current ledger as a u64. * @returns the timestamp number of the current ledger as a u64. */ export function getLedgerTimestamp(): u64 { let tmp = get_ledger_timestamp(); if (isU64Small(tmp)) { return toU64Small(tmp); } return toU64(tmp); } /** * Return the network id (sha256 hash of network passphrase) of the current ledger as `Bytes`. The value is always 32 bytes in length. * @returns Return the network id of the current ledger as `Bytes` */ export function getLedgerNetworkId(): Bytes { return new Bytes(get_ledger_network_id()); } /** * Causes the currently executing contract to fail immediately. * It traps with with contract error status code and error code 0 */ export function fail(): void { fail_with_error(contractError(0)); } /** * Causes the currently executing contract to fail immediately. * It traps with contract error type and error code as given by parameter. * @param errCode the error code to use. */ export function failWithErrorCode(errCode: u32): void { fail_with_error(contractError(errCode)); } /** * Causes the currently executing contract to fail immediately. * It traps with the error given by parameter. * @param error ErrorVal */ export function failWithError(error: ErrorVal): void { fail_with_error(error); } /** * Lets the host publish a contract event. * `topics` is expected to be a `Vec` with length <= 4 that * cannot contain `Vec`, `Map`, or `Bytes` with length > 32 * Returns nothing on success, and panics on failure * @param topics the vector containing the topics. * @param data the data (host) value to publish in the event */ export function publishEvent(topics: Vec, data: Val): void { contract_event(topics.getHostObject(), data); } /** * Lets the host publish a "simple" contract event that has only one topic given as a small symbol. * @param topicSymbol the symbol string to be used as a topic. max 9 characters. [_0-9A-Za-z] * @param data data (host value) to be published in the event. */ export function publishSimpleEvent(topicSymbol: string, data: Val): void { let topic = fromSmallSymbolStr(topicSymbol); let topics = new Vec(); topics.pushBack(topic); contract_event(topics.getHostObject(), data); }