Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f420814
updo
jonesmac Jan 16, 2026
8ad3e34
clean up example envs
jonesmac Jan 16, 2026
389db9c
working debugger launch task
jonesmac Jan 16, 2026
846fdfc
use barrel sdk package
jonesmac Jan 16, 2026
6366eea
helper for getting a gateway and locator singleton
jonesmac Jan 16, 2026
647bff0
remove logic now in helper
jonesmac Jan 16, 2026
165cfc0
pass viewer instead of creating one
jonesmac Jan 16, 2026
1a1819b
extract getLocator helper to new file
jonesmac Jan 16, 2026
ea6bf14
Singleton gateway
JoelBCarter Jan 20, 2026
c00064f
Hoist default rpcUrl calculation
JoelBCarter Jan 20, 2026
a159102
Signer helper
JoelBCarter Jan 20, 2026
aabd7d7
Update signer account helper
JoelBCarter Jan 20, 2026
f9888e1
Use signer account helper
JoelBCarter Jan 20, 2026
41da0a1
pin version
JoelBCarter Jan 20, 2026
a94eea8
Remove duplicate logging
JoelBCarter Jan 20, 2026
bb5ab30
Add signer to locator
JoelBCarter Jan 20, 2026
4ca7be0
Update helpers
JoelBCarter Jan 20, 2026
3042ba6
Push env var parsing to root file
JoelBCarter Jan 20, 2026
7204833
Inline gateway creation
JoelBCarter Jan 20, 2026
3112a91
Extract tx helper
JoelBCarter Jan 20, 2026
b128869
use locator for deps
JoelBCarter Jan 20, 2026
22655c0
Parse config before using ENV VARs
JoelBCarter Jan 20, 2026
2d9bdad
ENV Helpers
JoelBCarter Jan 20, 2026
40f815a
Use ENV helpers
JoelBCarter Jan 20, 2026
74f23d2
Use ENV helpers
JoelBCarter Jan 20, 2026
1cce55b
Resolve ENV VARs once
JoelBCarter Jan 21, 2026
5264657
Update documentation
JoelBCarter Jan 21, 2026
f2204bc
Merge pull request #8 from XYOracleNetwork/feature/simplify-construction
jonesmac Jan 21, 2026
d26ef8d
match getter file format
jonesmac Jan 21, 2026
a0f32f1
updo
jonesmac Jan 21, 2026
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
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Wallet mnemonic (seed phrase)
# Ensure default account has sufficient funds for transactions
# This is my seed phrase for sequence
XYO_WALLET_MNEMONIC="orbit torch boil interest warrior spoon lounge ecology knock cereal mango habit"

# RPC URL for the XYO network [Localhost]
Expand Down
20 changes: 8 additions & 12 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,22 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
{
"type": "node",
"request": "launch",
"name": "Node Hello World Sample",
"program": "${workspaceFolder}/dist/index.js",
"args": [],
"outFiles": [
"${workspaceFolder}/dist/**"
],
"name": "Node Hello World Runner",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/tsx",
"runtimeArgs": [
"--max-old-space-size=8192"
],
"program": "${workspaceFolder}/src/index.ts",
"args": [],
"envFile": "${workspaceFolder}/.env",
"sourceMaps": true,
"resolveSourceMapLocations": [
"!**/node_modules/**",
],
"pauseForSourceMap": true,
"cwd": "${workspaceFolder}",
"preLaunchTask": "build",
"skipFiles": [
"<node_internals>/**"
],
},
{
"type": "node",
Expand Down
35 changes: 17 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,26 @@
"updo": "npx npm-check-updates -i"
},
"dependencies": {
"@xylabs/assert": "5.0.33",
"@xylabs/delay": "5.0.33",
"@xylabs/typeof": "5.0.33",
"@xylabs/tsconfig": "7.2.8",
"@xyo-network/payload-builder": "5.1.22",
"@xyo-network/wallet": "5.1.22",
"@xyo-network/xl1-protocol": "1.13.11",
"@xyo-network/xl1-protocol-sdk": "1.16.12",
"@xyo-network/xl1-rpc": "1.16.12",
"@xylabs/assert": "5.0.63",
"@xylabs/delay": "5.0.63",
"@xylabs/tsconfig": "7.2.32",
"@xylabs/typeof": "5.0.63",
"@xyo-network/payload-builder": "5.2.25",
"@xyo-network/wallet": "5.2.25",
"@xyo-network/xl1-sdk": "1.18.33",
"dotenv": "17.2.3"
},
"devDependencies": {
"@types/node": "24.10.1",
"@xylabs/eslint-config-flat": "7.2.8",
"@xyo-network/payload-model": "5.1.22",
"@xyo-network/xl1-cli": "1.16.12",
"eslint": "9.39.1",
"@types/node": "25.0.9",
"@xylabs/eslint-config-flat": "7.2.32",
"@xyo-network/account-model": "5.2.25",
"@xyo-network/payload-model": "5.2.25",
"@xyo-network/xl1-cli": "1.18.1",
"eslint": "9.39.2",
"eslint-import-resolver-typescript": "4.4.4",
"npm-check-updates": "19.1.2",
"tsx": "4.20.6",
"typedoc": "0.28.14",
"npm-check-updates": "19.3.1",
"tsx": "4.21.0",
"typedoc": "0.28.16",
"typedoc-plugin-markdown": "4.9.0",
"typescript": "5.9.3"
},
Expand All @@ -60,4 +59,4 @@
"publishConfig": {
"access": "restricted"
}
}
}
27 changes: 27 additions & 0 deletions src/getGateway.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { isDefined } from '@xylabs/typeof'
import type { SimpleXyoSigner, XyoConnection } from '@xyo-network/xl1-sdk'
import {
SimpleXyoGatewayRunner, XyoConnectionMoniker, XyoSignerMoniker,
} from '@xyo-network/xl1-sdk'

import { getLocator } from './getLocator.ts'

let gateway: SimpleXyoGatewayRunner | undefined

export const getGateway = async () => {
// If existing gateway, return it
if (isDefined(gateway)) return gateway

// Otherwise, build a new gateway

// Get locator
const locator = await getLocator()

// Use locator to get connection and signer
const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)
const signer = await locator.getInstance<SimpleXyoSigner>(XyoSignerMoniker)

// Create gateway from connection and signer
gateway = new SimpleXyoGatewayRunner(connection, signer)
return gateway
}
24 changes: 24 additions & 0 deletions src/getLocator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { isDefined } from '@xylabs/typeof'
import type { ProviderFactoryLocator } from '@xyo-network/xl1-sdk'
import { buildJsonRpcProviderLocator, SimpleXyoSigner } from '@xyo-network/xl1-sdk'

import { getSignerAccount } from './getSignerAccount.ts'
import { getTransportFactory } from './getTransportFactory.ts'

let locator: ProviderFactoryLocator

export const getLocator = async () => {
// If existing locator, return it
if (isDefined(locator)) return locator

// Build a new locator
const transportFactory = getTransportFactory()
locator = await buildJsonRpcProviderLocator({ transportFactory })

// Register the signer with the locator
const account = await getSignerAccount()
locator.register(SimpleXyoSigner.factory<SimpleXyoSigner>(SimpleXyoSigner.dependencies, { account }))

// Return the locator
return locator
}
22 changes: 22 additions & 0 deletions src/getRandomTransactionData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { PayloadBuilder } from '@xyo-network/payload-builder'
import type { Payload } from '@xyo-network/payload-model'
import type { HashPayload } from '@xyo-network/xl1-sdk'

/**
* Generates random data for a transaction.
* @returns An object containing off-chain and on-chain data for the transaction.
*/
export const getRandomTransactionData = async () => {
// Data to store off-chain
const salt = `Hello from Sample - ${new Date().toISOString()}`
const idPayload: Payload<{ salt: string }> = { schema: 'network.xyo.id', salt }

// Data to store on-chain (can reference the off-chain data)
const hash = await PayloadBuilder.hash(idPayload)
const hashPayload: HashPayload = { schema: 'network.xyo.hash', hash }

return {
offChainData: [idPayload],
onChainData: [hashPayload],
}
}
13 changes: 13 additions & 0 deletions src/getRpcUrl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { config } from 'dotenv'

// Load environment variables from .env file
config({ quiet: true })

// Parse the relevant ENV VARs or use defaults
const rpcUrl = process.env.XYO_CHAIN_RPC_URL ?? 'http://localhost:8080/rpc'

/**
* Gets the rpcUrl to use for interacting with the chain
* @returns The rpcUrl to use for interacting with the chain
*/
export const getRpcUrl = (): string => rpcUrl
23 changes: 23 additions & 0 deletions src/getSignerAccount.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { isDefined } from '@xylabs/typeof'
import type { AccountInstance } from '@xyo-network/account-model'
import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-sdk'

import { getWalletMnemonic } from './getWalletMnemonic.ts'

let signerAccount: AccountInstance | undefined

/**
* Retrieves the signer account derived from the configured mnemonic.
* @returns The derived account
*/
export const getSignerAccount = async () => {
// If existing signer account, return it
if (isDefined (signerAccount)) return signerAccount

// Create new signer account
const walletMnemonic = getWalletMnemonic()
const wallet = await generateXyoBaseWalletFromPhrase(walletMnemonic)
signerAccount = await wallet.derivePath(ADDRESS_INDEX.XYO)
console.log('Using signer account:', signerAccount.address)
return signerAccount
}
22 changes: 22 additions & 0 deletions src/getTransportFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { isDefined } from '@xylabs/typeof'
import type { RpcSchemaMap, TransportFactory } from '@xyo-network/xl1-sdk'
import { HttpRpcTransport } from '@xyo-network/xl1-sdk'

import { getRpcUrl } from './getRpcUrl.ts'

let transportFactory: TransportFactory | undefined

/**
* Retrieves a transport factory for the configured RPC URL.
* @returns A transport factory for the configured RPC URL
*/
export const getTransportFactory = () => {
// If existing transport factory, return it
if (isDefined(transportFactory)) return transportFactory

// Build a new transport factory
const rpcUrl = getRpcUrl()
console.log('Using rpcUrl:', rpcUrl)
transportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(rpcUrl, schemas)
return transportFactory
}
14 changes: 14 additions & 0 deletions src/getWalletMnemonic.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { HDWallet } from '@xyo-network/wallet'
import { config } from 'dotenv'

// Load environment variables from .env file
config({ quiet: true })

// Parse the relevant ENV VARs or use defaults
const mnemonic = process.env.XYO_WALLET_MNEMONIC ?? HDWallet.generateMnemonic()

/**
* Gets the mnemonic to use for the wallet
* @returns The mnemonic to use for the wallet
*/
export const getWalletMnemonic = (): string => mnemonic
58 changes: 11 additions & 47 deletions src/helloWorld.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,25 @@
import { assertEx } from '@xylabs/assert'
import { isError } from '@xylabs/typeof'
import { PayloadBuilder } from '@xyo-network/payload-builder'
import type { Payload } from '@xyo-network/payload-model'
import type { HashPayload, SignedHydratedTransaction } from '@xyo-network/xl1-protocol'
import {
ADDRESS_INDEX, generateXyoBaseWalletFromPhrase,
SimpleXyoGatewayRunner,
SimpleXyoSigner,
} from '@xyo-network/xl1-protocol-sdk'
import { HttpRpcXyoConnection } from '@xyo-network/xl1-rpc'
import { config } from 'dotenv'
import type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'

// Load environment variables from .env file
config({ quiet: true })
import { getGateway } from './getGateway.ts'
import { getRandomTransactionData } from './getRandomTransactionData.ts'

// Log to console
const logger = console

export async function helloWorld(mnemonic?: string, rpcEndpoint = 'http://localhost:8080/rpc'): Promise<void> {
/**
* Runs a simple "Hello World" transaction on the XL1 network.
*/
export async function helloWorld(): Promise<void> {
try {
console.log('\n**** Starting XL1 Hello World NodeJs Sample ****\n')

// Load the account to use for the transaction
const walletMnemonic = assertEx(process.env.XYO_WALLET_MNEMONIC ?? mnemonic, () => 'Unable to resolve mnemonic from environment variable or argument')
const account = await (await generateXyoBaseWalletFromPhrase(walletMnemonic)).derivePath(ADDRESS_INDEX.XYO)
console.log('Using account:', account.address)

// Determine the RPC endpoint to use for the chain connection
const endpoint = process.env.XYO_CHAIN_RPC_URL ?? rpcEndpoint
console.log('Using endpoint:', endpoint)

// Create a new RPC connection
const connection = new HttpRpcXyoConnection({ endpoint })
const signer = new SimpleXyoSigner(account)
const gateway = new SimpleXyoGatewayRunner(connection, signer)

// Generate random data to send in the transaction
const { onChainData, offChainData } = await getRandomTransactionData()

// Get gateway to interact with the chain
const gateway = await getGateway()

// Send the transaction to the network
const [txHash] = await gateway.addPayloadsToChain(onChainData, offChainData)

Expand All @@ -54,22 +37,3 @@ const logSuccess = (_tx: SignedHydratedTransaction) => {
console.log('1. Install the XYO Layer One Wallet from https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm')
console.log('2. In that same browser, go to: https://explore.xyo.network/xl1/local/')
}

/**
* Generates random data for a transaction.
* @returns An object containing off-chain and on-chain data for the transaction.
*/
const getRandomTransactionData = async () => {
// Data to store off-chain
const salt = `Hello from Sample - ${new Date().toISOString()}`
const idPayload: Payload<{ salt: string }> = { schema: 'network.xyo.id', salt }

// Data to store on-chain (can reference the off-chain data)
const hash = await PayloadBuilder.hash(idPayload)
const hashPayload: HashPayload = { schema: 'network.xyo.hash', hash }

return {
offChainData: [idPayload],
onChainData: [hashPayload],
}
}
Loading