Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

example-auto-join

A library and demo app for fetching and joining Aleo records using the Provable SDK. Supports credits.aleo and token registry programs on both testnet and mainnet.

AutoJoin Library

The library lives in src/aleo/ and provides two main building blocks:

  • AleoClient — wraps the Provable SDK to handle network initialization, JWT auth, record scanning, and delegated proving.
  • AutoJoinClient — orchestrates joining records using a pluggable JoinStrategy.

JoinStrategy

A JoinStrategy controls how records are joined. Two strategies are included:

BasicAutoJoinStrategy

Calls the standard join(recordA, recordB) transition directly on the token's own program. Works with any token that exposes a join transition.

Timing: Joins records in pairs across parallel rounds. Reducing N records requires ⌈log₂ N⌉ rounds of on-chain confirmations (e.g. 16 records → 4 rounds). The rounds execute multiple join transactions with a total of: 8 + 4 + 2 + 1 = 15 transactions.

BatchAutoJoinStrategy

Calls join_N transitions on dedicated batch wrapper programs (e.g. autojoin_credits_2_10.aleo) that accept 2–16 records in a single transaction.

Supported programs: Same base set as BasicAutoJoinStrategy, but only programs that have deployed batch wrappers on-chain. Arbitrary tokens with a join transition are not supported. More on chain programs can be deployed to support batch joining of other tokens. We expect to deploy a generic "dynamic dispatch" batch join program later this year (2026).

Timing: Up to 16 records collapse in one transaction. Most joins complete in a single confirmation round, making this significantly faster than BasicAutoJoinStrategy for large record sets. Ex. 32 records can be joined in 2 rounds of 3 total transactions.

Cost: The batch programs introduce a small gas fee cost overhead over just using the built-in join calls, however in practice this is very small in absolute terms due to the low cost of the Aleo network transactions.

BasicAutoJoinStrategyBatchAutoJoinStrategy
Works with any join tokenYesNo — requires batch wrapper programs
Records per transaction22–16
Rounds to join N records⌈log₂ N⌉⌈log₁₆ N⌉

You can provide your own strategy by implementing the interface:

interfaceJoinStrategy{isSupportedProgram(programName: string): boolean;joinRecords(records: AleoRecord[]): Promise<AleoRecord>;}

Example: Fetch and Join Records

1. Initialize the client

import{AleoClient}from'./src/aleo/aleoClient';import{AutoJoinClient}from'./src/aleo/autojoin/autoJoinClient';import{BasicAutoJoinStrategy}from'./src/aleo/autojoin/strategies/basicAutoJoinStrategy';constaleoClient=newAleoClient('testnet',{apiKey: 'YOUR_API_KEY',consumerId: 'YOUR_CONSUMER_ID',apiRoot: 'https://api.provable.com',// optional, this is the default});// Must be called before any other operationsawaitaleoClient.initNetwork();

2. Derive an account from a private key

constaccount=aleoClient.accountFromPrivateKey('APrivateKey1zkp...');

3. Register the account for record scanning

Registers the account's view key with the record scanner. Idempotent — safe to call multiple times.

awaitaleoClient.registerAccountForRecordScanning(account);

4. Fetch unspent records

constrecords=awaitaleoClient.fetchUnspentRecords(account,['credits.aleo'],// one or more program names to filter byaccount.address().to_string()// optional; derived from account if omitted);for(constrecordofrecords){console.log(record.programName);// e.g. 'credits.aleo'console.log(record.transactionId);// transaction that created this recordconsole.log(record.amount);// microcredits as a string, undefined if not parseable}

5. Join records

Reduces any number of records down to one by pairing and joining them in parallel rounds.

constautoJoinClient=newAutoJoinClient(aleoClient,account,BasicAutoJoinStrategy);constjoinedRecord=awaitautoJoinClient.joinRecords(records);console.log('Final record tx:',joinedRecord.transactionId);

joinRecords validates that all records share the same program, are owned by the same address, are supported by the strategy, and each have a transactionId. It throws a descriptive error if any condition is not met or if on-chain confirmation times out.


Demo Frontend

The React demo app lets you enter a private key, browse unspent records for a selected program, and trigger a join across all loaded records.

Setup

Copy the environment template and fill in your credentials:

cp .env.example .env
VariableDescription
VITE_PROVABLE_API_KEYYour Provable API key
VITE_PROVABLE_CONSUMER_IDYour Provable consumer ID
VITE_PROVABLE_API_ROOTAPI root URL (optional, defaults to https://api.provable.com)
VITE_DEFAULT_PKEYPre-fills the private key input (optional, development only)

Commands

# Install dependencies
pnpm install
# Start the development server (http://localhost:5173)
pnpm dev
# Type-check and build for production
pnpm build
# Preview the production build locally
pnpm preview

About

Example code and demo React app for joining Aleo records efficiently (aleo, usdcx, usad)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages