Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
030fce0
update
zkSoju Aug 22, 2025
4fa321c
update
zkSoju Aug 22, 2025
cd005fd
push
zkSoju Aug 22, 2025
3976151
update
zkSoju Aug 25, 2025
bbba5cc
update
zkSoju Aug 25, 2025
6fabec1
Update config.yaml
zkSoju Aug 25, 2025
fe58ed1
Update config.yaml
zkSoju Aug 25, 2025
9faa003
Update henlo-burns.ts
zkSoju Aug 25, 2025
a119cc2
Update henlo-burns.ts
zkSoju Aug 26, 2025
93dfcdd
add wall indexing
notzerker Sep 2, 2025
a60afe1
fix wall events
notzerker Sep 2, 2025
d6d940a
add direct wall deposits
notzerker Sep 2, 2025
c5cedab
fix
notzerker Sep 2, 2025
ee056dc
fix
notzerker Sep 2, 2025
0254160
fix
notzerker Sep 2, 2025
fe15a47
fix total kiquidity
notzerker Sep 2, 2025
36f5f88
update
zkSoju Sep 3, 2025
8a6defd
Update config.yaml
zkSoju Sep 3, 2025
fc7ebc4
Update config.yaml
zkSoju Sep 3, 2025
d830d98
c
zkSoju Sep 9, 2025
9d64856
add Crayons
zkSoju Sep 14, 2025
00c8f66
add # of arsonists
notzerker Sep 21, 2025
9bebec1
fix build
notzerker Sep 21, 2025
805d677
Update crayons.ts
notzerker Sep 21, 2025
9575100
fix indexing
notzerker Sep 21, 2025
0b538e8
add erc721 mints
notzerker Sep 29, 2025
ebee78e
add new stuff to track
notzerker Sep 30, 2025
888c738
fix
notzerker Sep 30, 2025
f7cab81
test
notzerker Oct 1, 2025
234242a
Revert "test"
notzerker Oct 1, 2025
91c2f1e
Update constants.ts
notzerker Oct 1, 2025
bd2eb5f
Update bgt.ts
notzerker Oct 1, 2025
025ec3a
add normalized actions feed for missions
notzerker Oct 1, 2025
d5cb2c9
Add tracked ERC721 holder indexer for mibera
notzerker Oct 15, 2025
357428c
Track additional Mibera ERC721 collections
notzerker Oct 17, 2025
b750c4d
feat(badges): index cub badge holders
notzerker Oct 21, 2025
ef9ef10
fix(thj-envio): align badge holder tracking
notzerker Oct 21, 2025
57473d1
chore(thj-envio): track cub mainnet badge contract
notzerker Oct 21, 2025
0b981c7
update holding steps
notzerker Oct 21, 2025
0879693
Add mibera_tarot to GeneralMints handler for quest verification
zkSoju Oct 28, 2025
d70251b
commit
zkSoju Oct 29, 2025
edcee5c
Move Claude Code infrastructure to workspace root
zkSoju Nov 1, 2025
974beff
add candies current supply
zkSoju Nov 2, 2025
5d490de
deploy
zkSoju Nov 7, 2025
23ad925
perf: Optimize Envio handlers for 40-50% faster indexing
zkSoju Nov 7, 2025
0ff6882
commit
zkSoju Nov 12, 2025
589d280
Fix S&F position tracking: Add vaultShares and totalShares fields
zkSoju Nov 19, 2025
a82833e
feat: add Mibera staking tracking for PaddleFi and Jiko
notzerker Nov 19, 2025
c6151cb
add dynamic SF vault strategy and multi rewards tracking
ZERGUCCI Nov 20, 2025
c5a748b
fix package dependencies lacking viem
ZERGUCCI Nov 20, 2025
4e342f8
fix: backfill firstDepositAt for existing S&F positions
zkSoju Nov 20, 2025
37133d9
fix: consolidate Mibera NFT handling in TrackedErc721 to fix holder v…
zkSoju Nov 20, 2025
1d812f7
update schema layout
ZERGUCCI Nov 21, 2025
8100402
update envio to latest version
ZERGUCCI Nov 21, 2025
082c918
fix build errors
ZERGUCCI Nov 21, 2025
153abb4
commit
zkSoju Nov 23, 2025
3c2c56c
Merge remote changes + fix HENLOCKED negative balances
zkSoju Nov 23, 2025
c3c4517
fix: correct HENLOCKED strike values in HenloVault handler
zkSoju Nov 23, 2025
f6d0aa1
refactor: Unify ERC20 handlers to fix HenloBurn indexing
zkSoju Nov 24, 2025
6372969
commit
zkSoju Nov 26, 2025
77322f5
feat: Add Henlocker vault system handlers for Subsquid migration
zkSoju Nov 26, 2025
7426b18
commit
zkSoju Dec 1, 2025
0651cc1
feat: Add MiDi indexer support for Premint, Sets, friend.tech, and burns
notzerker Dec 1, 2025
bec357b
feat: Add transfer tracking for MiberaSets, Mibera, and Mibera Zora
notzerker Dec 1, 2025
f3f5cc3
fix: Correct Mibera Zora to use ERC-1155 handler (was incorrectly ERC…
notzerker Dec 1, 2025
4be216b
refactor: Centralize mint/burn detection and constants
notzerker Dec 1, 2025
f6e773a
Add NFT burn tracking for Mibera and Milady
notzerker Dec 1, 2025
f70e3f2
fix(optimism): Update start block to MiberaSets contract creation
notzerker Dec 2, 2025
a1e7e19
feat: Add Seaport marketplace indexing + MintActivity tracking
zkSoju Dec 2, 2025
07c46df
feat: Add secondary sale tracking and PaddleFi lending handlers
notzerker Dec 3, 2025
eac1942
Add comprehensive marketplace addresses for secondary sale detection
notzerker Dec 3, 2025
d2e0366
update contract addresses to be the new final SF vaults and multiRewards
ZERGUCCI Dec 3, 2025
b95298f
fix the vault config to point to the new vaults
ZERGUCCI Dec 4, 2025
764ef9c
fix: Remove incorrect Honeycomb address from CubBadges1155
zkSoju Dec 4, 2025
3873051
fix: use correct epochId when updating HenloVaultRound deposits
notzerker Dec 13, 2025
844a066
fix: add missing 20000 strike to STRIKE_TO_TOKEN mapping
notzerker Dec 14, 2025
2431853
chore: trigger redeploy with updated RPC config
notzerker Dec 14, 2025
ee65da9
fix: add fallback for multiRewardsAddress RPC failures
notzerker Dec 14, 2025
0f7aaad
perf(indexer): Add parallel await optimizations and prevent negative …
zkSoju Dec 14, 2025
00d290e
perf(indexer): Remove RPC calls from sf-vaults contractRegister
zkSoju Dec 14, 2025
02d2724
revert: Keep RPC fallback in sf-vaults - StrategyUpdated is rare
zkSoju Dec 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 210 additions & 0 deletions .temp_wip/cargo-trades.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
/*
* CandiesTrade event handlers
*
* Tracks ERC-1155 cargo/drug trading events from the CandiesTrade contract:
* - TradeProposed: User proposes a targeted trade (specific amounts of tokens)
* - TradeAccepted: Target user accepts the trade
* - TradeCancelled: Proposer cancels the trade
*
* Contract: TBD (will be deployed from /mibera-contracts/honey-road)
*/

import { CandiesTrade as CandiesTradeContract, CandiesTrade, TradeStats } from "generated";

const FIFTEEN_MINUTES = 15n * 60n; // 15 minutes in seconds

/**
* Handle TradeProposed event
* Creates a new active cargo trade proposal
*/
export const handleCandiesTradeProposed = CandiesTradeContract.TradeProposed.handler(
async ({ event, context }) => {
const {
proposer,
tradeId,
offeredTokenId,
offeredAmount,
requestedTokenId,
requestedAmount,
requestedFrom,
timestamp,
} = event.params;

const proposerLower = proposer.toLowerCase();
const requestedFromLower = requestedFrom.toLowerCase();
const timestampBigInt = BigInt(timestamp.toString());
const expiresAt = timestampBigInt + FIFTEEN_MINUTES;

// Create trade entity
// Use tx hash + log index for unique ID
const id = `${event.transaction.hash}_${event.logIndex}`;

const trade: CandiesTrade = {
id,
tradeId: BigInt(tradeId.toString()),
offeredTokenId: BigInt(offeredTokenId.toString()),
offeredAmount: BigInt(offeredAmount.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
requestedAmount: BigInt(requestedAmount.toString()),
proposer: proposerLower,
requestedFrom: requestedFromLower,
acceptor: undefined, // Null until accepted
status: "active",
proposedAt: timestampBigInt,
completedAt: undefined, // Null until completed
expiresAt,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.CandiesTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "candies_proposed");
}
);

/**
* Handle TradeAccepted event
* Marks cargo trade as completed
*/
export const handleCandiesTradeAccepted = CandiesTradeContract.TradeAccepted.handler(
async ({ event, context }) => {
const {
acceptor,
tradeId,
offeredTokenId,
offeredAmount,
requestedTokenId,
requestedAmount,
originalProposer,
} = event.params;

const acceptorLower = acceptor.toLowerCase();
const proposerLower = originalProposer.toLowerCase();
const timestamp = BigInt(event.block.timestamp);

// Use tx hash + log index for unique ID
const id = `${event.transaction.hash}_${event.logIndex}`;

const trade: CandiesTrade = {
id,
tradeId: BigInt(tradeId.toString()),
offeredTokenId: BigInt(offeredTokenId.toString()),
offeredAmount: BigInt(offeredAmount.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
requestedAmount: BigInt(requestedAmount.toString()),
proposer: proposerLower,
requestedFrom: acceptorLower, // The acceptor was the requested recipient
acceptor: acceptorLower,
status: "completed",
proposedAt: timestamp, // We don't have the original proposal time
completedAt: timestamp,
expiresAt: timestamp + FIFTEEN_MINUTES,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.CandiesTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "candies_completed");
}
);

/**
* Handle TradeCancelled event
* Marks cargo trade as cancelled
*/
export const handleCandiesTradeCancelled = CandiesTradeContract.TradeCancelled.handler(
async ({ event, context }) => {
const {
canceller,
tradeId,
offeredTokenId,
offeredAmount,
requestedTokenId,
requestedAmount,
} = event.params;

const cancellerLower = canceller.toLowerCase();
const timestamp = BigInt(event.block.timestamp);

// Use tx hash + log index for unique ID
const id = `${event.transaction.hash}_${event.logIndex}`;

const trade: CandiesTrade = {
id,
tradeId: BigInt(tradeId.toString()),
offeredTokenId: BigInt(offeredTokenId.toString()),
offeredAmount: BigInt(offeredAmount.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
requestedAmount: BigInt(requestedAmount.toString()),
proposer: cancellerLower,
requestedFrom: cancellerLower, // Proposer is cancelling
acceptor: undefined,
status: "cancelled",
proposedAt: timestamp, // We don't have the original proposal time
completedAt: timestamp,
expiresAt: timestamp + FIFTEEN_MINUTES,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.CandiesTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "candies_cancelled");
}
);

/**
* Update global trade statistics
*/
async function updateTradeStats(
context: any,
chainId: number,
action: "candies_proposed" | "candies_completed" | "candies_cancelled"
): Promise<void> {
const statsId = "global";

// Get existing stats or create new
let stats = await context.TradeStats.get(statsId);

if (!stats) {
stats = {
id: statsId,
totalMiberaTrades: 0,
completedMiberaTrades: 0,
cancelledMiberaTrades: 0,
expiredMiberaTrades: 0,
totalCandiesTrades: 0,
completedCandiesTrades: 0,
cancelledCandiesTrades: 0,
expiredCandiesTrades: 0,
uniqueTraders: 0,
lastTradeTime: undefined,
chainId: chainId,
};
}

// Update stats based on action
const updatedStats: TradeStats = {
...stats,
totalCandiesTrades: action === "candies_proposed"
? stats.totalCandiesTrades + 1
: stats.totalCandiesTrades,
completedCandiesTrades: action === "candies_completed"
? stats.completedCandiesTrades + 1
: stats.completedCandiesTrades,
cancelledCandiesTrades: action === "candies_cancelled"
? stats.cancelledCandiesTrades + 1
: stats.cancelledCandiesTrades,
lastTradeTime: BigInt(Date.now()),
};

context.TradeStats.set(updatedStats);
}
178 changes: 178 additions & 0 deletions .temp_wip/mibera-trades.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
/*
* MiberaTrade event handlers
*
* Tracks ERC-721 NFT trading events from the MiberaTrade contract:
* - TradeProposed: User proposes a 1-for-1 NFT swap
* - TradeAccepted: Recipient accepts the trade
* - TradeCancelled: Proposer cancels the trade
*
* Contract: 0x90485B61C9dA51A3c79fca1277899d9CD5D350c2 (Berachain)
*/

import { MiberaTrade as MiberaTradeContract, MiberaTrade, TradeStats } from "generated";

const FIFTEEN_MINUTES = 15n * 60n; // 15 minutes in seconds

/**
* Handle TradeProposed event
* Creates a new active trade proposal
*/
export const handleMiberaTradeProposed = MiberaTradeContract.TradeProposed.handler(
async ({ event, context }) => {
const { proposer, offeredTokenId, requestedTokenId, timestamp } = event.params;

const proposerLower = proposer.toLowerCase();
const timestampBigInt = BigInt(timestamp.toString());
const expiresAt = timestampBigInt + FIFTEEN_MINUTES;

// Create trade entity
// Use offeredTokenId as part of ID since each NFT can only have one active trade
const tradeId = `${event.transaction.hash}_${offeredTokenId.toString()}`;

const trade: MiberaTrade = {
id: tradeId,
offeredTokenId: BigInt(offeredTokenId.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
proposer: proposerLower,
acceptor: undefined, // Null until accepted
status: "active",
proposedAt: timestampBigInt,
completedAt: undefined, // Null until completed
expiresAt,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.MiberaTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "mibera_proposed");
}
);

/**
* Handle TradeAccepted event
* Marks trade as completed
*/
export const handleMiberaTradeAccepted = MiberaTradeContract.TradeAccepted.handler(
async ({ event, context }) => {
const { acceptor, offeredTokenId, requestedTokenId, originalProposer } = event.params;

const acceptorLower = acceptor.toLowerCase();
const timestamp = BigInt(event.block.timestamp);

// Find the trade by offeredTokenId
// Need to search for active trades with this offeredTokenId
// Since we don't have complex queries, we'll use a predictable ID pattern
// The trade was created with ID: tx_hash_offeredTokenId
// We don't know the original tx hash, so we'll create a new entity with completion data

// For completed trades, we'll use the acceptance tx hash as ID
const tradeId = `${event.transaction.hash}_${offeredTokenId.toString()}`;

const trade: MiberaTrade = {
id: tradeId,
offeredTokenId: BigInt(offeredTokenId.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
proposer: originalProposer.toLowerCase(),
acceptor: acceptorLower,
status: "completed",
proposedAt: timestamp, // We don't have the original proposal time, use completion time
completedAt: timestamp,
expiresAt: timestamp + FIFTEEN_MINUTES,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.MiberaTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "mibera_completed");
}
);

/**
* Handle TradeCancelled event
* Marks trade as cancelled
*/
export const handleMiberaTradeCancelled = MiberaTradeContract.TradeCancelled.handler(
async ({ event, context }) => {
const { canceller, offeredTokenId, requestedTokenId } = event.params;

const cancellerLower = canceller.toLowerCase();
const timestamp = BigInt(event.block.timestamp);

// Similar to acceptance, use cancellation tx hash as ID
const tradeId = `${event.transaction.hash}_${offeredTokenId.toString()}`;

const trade: MiberaTrade = {
id: tradeId,
offeredTokenId: BigInt(offeredTokenId.toString()),
requestedTokenId: BigInt(requestedTokenId.toString()),
proposer: cancellerLower,
acceptor: undefined,
status: "cancelled",
proposedAt: timestamp, // We don't have the original proposal time
completedAt: timestamp,
expiresAt: timestamp + FIFTEEN_MINUTES,
txHash: event.transaction.hash,
blockNumber: BigInt(event.block.number),
chainId: event.chainId,
};

context.MiberaTrade.set(trade);

// Update stats
await updateTradeStats(context, event.chainId, "mibera_cancelled");
}
);

/**
* Update global trade statistics
*/
async function updateTradeStats(
context: any,
chainId: number,
action: "mibera_proposed" | "mibera_completed" | "mibera_cancelled"
): Promise<void> {
const statsId = "global";

// Get existing stats or create new
let stats = await context.TradeStats.get(statsId);

if (!stats) {
stats = {
id: statsId,
totalMiberaTrades: 0,
completedMiberaTrades: 0,
cancelledMiberaTrades: 0,
expiredMiberaTrades: 0,
totalCandiesTrades: 0,
completedCandiesTrades: 0,
cancelledCandiesTrades: 0,
expiredCandiesTrades: 0,
uniqueTraders: 0,
lastTradeTime: undefined,
chainId: chainId,
};
}

// Update stats based on action
const updatedStats: TradeStats = {
...stats,
totalMiberaTrades: action === "mibera_proposed"
? stats.totalMiberaTrades + 1
: stats.totalMiberaTrades,
completedMiberaTrades: action === "mibera_completed"
? stats.completedMiberaTrades + 1
: stats.completedMiberaTrades,
cancelledMiberaTrades: action === "mibera_cancelled"
? stats.cancelledMiberaTrades + 1
: stats.cancelledMiberaTrades,
lastTradeTime: BigInt(Date.now()),
};

context.TradeStats.set(updatedStats);
}
Loading