Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 0 additions & 6 deletions the_last_indexer/apibara.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@ export default defineConfig({
streamUrl: "https://mainnet.starknet.a5a.ch",
contractAddress:
"0x01710ab6e17d6809cd9d5e9b22e6bb1d1d09ca40f50449ea7ac81d67bef80f31",
},
crowdfunding: {
startingBlock: "0",
streamUrl: "https://mainnet.starknet.a5a.ch",
contractAddress:
"0x02c92666029b207dc882c267d7b55c3fe4178e9f550f7188cd49adb85f963623",
}
},
});
10 changes: 10 additions & 0 deletions the_last_indexer/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,13 @@ export const USDC_TOKEN_ADDRESS = "0x053c91253bc9682c04929ca02ed00b3e423f6710d2e
export const WBTC_TOKEN_ADDRESS = "0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac";

export const TRANSFER_SELECTOR = getSelector("Transfer");

export const GROUP_ADDRESS = "0x01710ab6e17d6809cd9d5e9b22e6bb1d1d09ca40f50449ea7ac81d67bef80f31";
export const CROWDFUNDING_ADDRESS = "0x02c92666029b207dc882c267d7b55c3fe4178e9f550f7188cd49adb85f963623";

// SELECTORS
export const POOL_CREATED_SELECTOR = getSelector("PoolCreated");
export const POOL_PAID_SELECTOR = getSelector("PoolPaid");
export const GROUP_CREATED_SELECTOR = getSelector("GroupCreated");
export const SUBSCRIPTION_TOPPED_SELECTOR = getSelector("SubscriptionTopped");
export const GROUP_PAID_SELECTOR = getSelector("GroupPaid");
90 changes: 90 additions & 0 deletions the_last_indexer/crowd_funding_functions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

// Cache exports
export const crowdFundingContractAddresses = await fetch(
`${process.env.API_URL}/crowdfunding/addresses`,
{
method: "GET",
headers: { "Content-Type": "application/json" },
}
)
.then((response) => response.json())
.then((data: any) => data);

export const group_address_cache = await fetch(
`${process.env.API_URL}/groups/addresses`,
{
method: "GET",
headers: { "Content-Type": "application/json" },
}
)
.then((response) => response.json())
.then((data: any) => data);

// Crowdfunding Functions
const create_crowd_funding = (
pool_address: string,
creator_address: string,
name: string,
target_amount: string
) => {
fetch(`${process.env.API_URL}/crowdfunding`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: JSON.stringify({
creator_address: creator_address,
name: name,
pool_address: pool_address,
target_amount: target_amount,
}),
});
};

const donate_to_crowd_funding = (
crowd_funding_address: string,
amount: string,
donor_address: string,
token_address: string,
transaction_hash: string
) => {
fetch(`${process.env.API_URL}/crowdfunding/${crowd_funding_address}/donate`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: JSON.stringify({
amount: amount,
donor_address: donor_address,
token_address: token_address,
transaction_hash: transaction_hash,
}),
});
};

const resolve_crowd_funding = (
crowd_funding_address: string,
amount: string,
token_address: string,
transaction_hash: string,
withdrawn_by: string
) => {
fetch(
`${process.env.API_URL}/crowdfunding/${crowd_funding_address}/resolve`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: JSON.stringify({
amount: amount,
token_address: token_address,
transaction_hash: transaction_hash,
withdrawn_by: withdrawn_by,
}),
}
);
};
105 changes: 105 additions & 0 deletions the_last_indexer/group_functions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@

// Group Functions
const create_group = (
address: string,
creatorAddress: string,
groupName: string,
usageCount: number,
members: Array<{ addr: string; percentage: number }>
) => {
const body = JSON.stringify({
created_by: creatorAddress,
group_address: address,
group_name: groupName,
members: members.map((member) => ({
addr: member.addr,
percentage: Number(member.percentage),
})),
usage_remaining: Number(usageCount),
});

fetch(`${process.env.API_URL}/groups`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: body,
}).catch((err) => {
console.error(`Create group error ${address}:`, err);
});
};

const pay = (
group_address: string,
from_address: string,
tx_hash: string,
token_amount: string,
token_address: string
) => {
const body = JSON.stringify({
from_address,
token_address,
token_amount,
tx_hash,
});

fetch(`${process.env.API_URL}/groups/${group_address}/pay`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: body,
}).catch((err) => {
console.error(`Payment error for ${group_address}:`, err);
});
};

const store_distribution_history = (
group_address: string,
token_address: string,
tx_hash: string,
usage_remaining: number,
token_amount: string,
members: Array<{ addr: string; share: string }>
) => {
const members_decoupled = members.map((member) => ({
member_address: member.addr,
member_amount: member.share,
}));

fetch(
`${process.env.API_URL}/groups/${group_address}/payment-distributions`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: JSON.stringify({
members: members_decoupled,
token_address: token_address,
token_amount: token_amount,
tx_hash: tx_hash,
usage_remaining: Number(usage_remaining),
}),
}
);
};

const subsciption_topped = (group_address: string, usage_count: number) => {
const body = JSON.stringify({
usage_count: usage_count,
});
fetch(`${process.env.API_URL}/groups/${group_address}/subscription`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"paymesh-api-key": `${process.env.PAYMESH_API_KEY}`,
},
body: body,
}).catch((err) => {
console.error(`Subscription top up error for ${group_address}:`, err);
});
};
10 changes: 8 additions & 2 deletions the_last_indexer/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
export const startingBlock = await fetch(
"https://starknet-mainnet.public.blastapi.io",
"https://starknet-mainnet.g.alchemy.com/v2/2kcD_qHq9FJV5ZI-BHY0q",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 0,
id: 1,
method: "starknet_blockNumber",
}),
}
)
.then((response) => response.json())
.then((data: any) => data.result);

// curl https://starknet-mainnet.g.alchemy.com/v2/2kcD_qHq9FJV5ZI-BHY0q \
// --request POST \
// --header 'accept: application/json' \
// --header 'content-type: application/json' \
// --data '{"id":1,"jsonrpc":"2.0","method":"starknet_blockNumber"}'

export function hexToString(hex: string): string {
if (!hex || !hex.match(/^0x[0-9a-fA-F]*$/)) {
return hex;
Expand Down
Loading