feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote
, '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

feat: cardano intrgration - #10

Open
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg
Open

feat: cardano intrgration#10
AdityaTote wants to merge 1 commit into
mainfrom
feat/cardano-intg

Conversation

@AdityaTote

Copy link
Copy Markdown
Contributor

#7 implemented cardano to backend

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds Cardano blockchain integration to the backend system, expanding the platform's multi-chain capabilities beyond Ethereum. The PR reorganizes existing Ethereum contracts into a dedicated subdirectory and introduces comprehensive Cardano smart contract clients for agent and stake management using Lucid-Cardano and Blockfrost.

Key Changes

  • Cardano Integration: Added complete Cardano blockchain support with agent and stake contract clients using Lucid-Cardano
  • Code Organization: Restructured contract files by separating Ethereum contracts into eth/ subdirectory for better multi-chain organization
  • New Dependencies: Added lucid-cardano@^0.10.11 and @blockfrost/blockfrost-js@^6.0.0 for Cardano blockchain interaction

Reviewed changes

Copilot reviewed 14 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/services/agent.service.tsUpdated import path for Ethereum agent contract
src/lib/utils/helper.tsUpdated import path for Ethereum stake contract
src/lib/env.tsAdded new environment variables for Cardano integration (BLACKFROST_PROJECT_ID, WALLET_PRIVATE_KEY) with formatting changes
src/lib/contracts/eth/stake.contract.tsMoved and updated with corrected import paths, commented out unused helper function
src/lib/contracts/eth/contract.tsMoved to eth subdirectory with unused Contract import removed
src/lib/contracts/eth/agent.contract.tsMoved to eth subdirectory with updated import path
src/lib/contracts/eth/abis/stake-abis.jsonMoved Ethereum stake contract ABI to eth subdirectory
src/lib/contracts/eth/abis/agent-abis.jsonMoved Ethereum agent contract ABI to eth subdirectory
src/lib/contracts/cardano/stake.contract.tsNew Cardano stake contract client with transfer functionality
src/lib/contracts/cardano/schema/stake-contract.types.tsType definitions and schemas for Cardano stake contract
src/lib/contracts/cardano/schema/agent-contract.types.tsType definitions and schemas for Cardano agent contract
src/lib/contracts/cardano/contract.tsBase Cardano contract client with Lucid and Blockfrost initialization
src/lib/contracts/cardano/agent.contract.tsCardano agent contract client with register, update, and query functionality
src/lib/contracts/cardano/abis/plutus.jsonPlutus smart contract ABIs for Cardano validators
package.jsonAdded Cardano dependencies and build script with formatting changes
bun.lockUpdated lockfile with new Cardano-related dependencies
.gitignoreAdded /dist directory to ignore list
.env.exampleUpdated with new required environment variables for Cardano integration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment on lines +28 to +35
async initialize() {
await super.initialize();

this.lucid.selectWalletFromPrivateKey(this.walletAddress);

this.stakeAddress = this.lucid.utils.validatorToAddress(
this.stakeValidator
);

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialize() method is called in the constructor but not awaited. This method is async and should be awaited to ensure proper initialization before the instance is used. Consider making getInstance() the only way to create instances and handle initialization there.

Copilot uses AI. Check for mistakes.

public static async getInstance(): Promise<StakeContractClient> {
if (!StakeContractClient.instance) {
StakeContractClient.instance = new StakeContractClient();

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The getInstance() method doesn't await the initialize() call, which means the instance might not be fully initialized when returned. This could lead to runtime errors when methods try to use this.lucid or this.stakeAddress before they're properly set up.

Suggested change
StakeContractClient.instance=newStakeContractClient();
StakeContractClient.instance=newStakeContractClient();
awaitStakeContractClient.instance.initialize();

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +43
public static async getInstance(): Promise<AgentContractClient> {
if (!AgentContractClient.instance) {
AgentContractClient.instance = new AgentContractClient();
await AgentContractClient.instance.initialize();
}
return AgentContractClient.instance;
}

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same initialization issue exists here. The initialize() method is async but not awaited when creating a new instance in getInstance(). This could cause this.agentAddress and this.agentUtxo to be undefined when methods are called immediately after getting the instance.

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +22
private network: Network.Preview;
private cardanoNodeUrl = NetworkURI[Network.Preview];
public lucid!: Lucid;
public blockfrost!: Blockfrost;

constructor(private config: { projectId: string }) {
this.network = Network.Preview;

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded network type Network.Preview limits flexibility. Consider making the network configurable through environment variables to support different environments (Mainnet, Preprod, Preview).

Suggested change
private network: Network.Preview;
privatecardanoNodeUrl=NetworkURI[Network.Preview];
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
this.network=Network.Preview;
private network: Network;
private cardanoNodeUrl: string;
publiclucid!: Lucid;
publicblockfrost!: Blockfrost;
constructor(privateconfig: {projectId: string}){
constenvNetwork=process.env.CARDANO_NETWORK;
if(
envNetwork===Network.Mainnet||
envNetwork===Network.Preprod||
envNetwork===Network.Preview
){
this.network=envNetworkasNetwork;
}else{
this.network=Network.Preview;
}
this.cardanoNodeUrl=NetworkURI[this.network];

Copilot uses AI. Check for mistakes.
import { setCookie } from "hono/cookie";
import { prisma } from "../lib/db";
import { agentContract } from "../lib/contracts/agent.contract";
import { agentContract } from "../lib/contracts/eth/agent.contract";

CopilotAINov 29, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import agentContract.

Suggested change
import { agentContract } from "../lib/contracts/eth/agent.contract";

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AdityaTote