Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b6a2895
feat: integrate treasury management features and refactor hackathon o…
0xdevcollins Jun 11, 2026
a0d21b2
chore: update package-lock.json dependencies
0xdevcollins Jun 11, 2026
8f3a14b
chore: update pre-push husky hook to perform full type-checks and pro…
0xdevcollins Jun 11, 2026
49fe90a
refactor: remove DevelopmentStatusModal from global layout
0xdevcollins Jun 11, 2026
3deb64c
feat: task-first Winners page, judging UX, private access, treasury r…
0xdevcollins Jun 16, 2026
0edc1aa
feat(bounty): ModeTab + SubmissionModelTab for the Configure wizard (…
Benjtalkshow Jun 16, 2026
fb527ff
feat(bounty): features/bounties data layer (types, keys, draft + escr…
Benjtalkshow Jun 16, 2026
4c31f6b
feat(bounty): wizard shell + step/draft machinery (#598) (#613)
Benjtalkshow Jun 17, 2026
a3a81a2
feat(bounty): Scope + Reward + Review tabs and Zod schemas (#600) (#614)
Benjtalkshow Jun 17, 2026
3b45ea9
feat(bounty): use-bounty-publish (escrow publish via shared runner) (…
Benjtalkshow Jun 17, 2026
8e71a49
feat(bounty): routes + organization bounty list page (#597) (#616)
Benjtalkshow Jun 17, 2026
40fd942
feat(bounty): sidebar nav entry + Post Bounty quick action (#602) (#617)
Benjtalkshow Jun 17, 2026
cad5635
feat(bounty): wizard enhancements + hackathon-style org bounty list (…
Benjtalkshow Jun 24, 2026
a0f17e0
Feat/crowdfunding (#620)
0xdevcollins Jun 24, 2026
495689f
Feat/crowdfunding (#642)
0xdevcollins Jun 24, 2026
b35875d
Feat/crowdfunding (#644)
0xdevcollins Jun 24, 2026
f48fc4d
Feat/crowdfunding (#648)
0xdevcollins Jun 24, 2026
c917f2b
Feat/crowdfunding (#650)
0xdevcollins Jun 24, 2026
62ce88d
feat: add tabbed navigation to campaign page for overview, milestones…
0xdevcollins Jun 24, 2026
ec2cbcb
refactor: enhance milestone detail page with status-specific feedback…
0xdevcollins Jun 25, 2026
2862bee
feat: add polling to campaign query and improve cache invalidation ac…
0xdevcollins Jun 25, 2026
f117fa7
feat(bounty): participant data layer (escrow client + hooks) (#643)
Benjtalkshow Jun 25, 2026
c621616
feat(bounty): public bounty marketplace (discover/list) (#645)
Benjtalkshow Jun 25, 2026
928aa73
feat(bounty): bounty detail page (/bounties/[id]) (#646)
Benjtalkshow Jun 25, 2026
37aa7d6
feat(bounty): apply / join / claim flow + edit/withdraw (mode-aware) …
Benjtalkshow Jun 25, 2026
c76b521
feat(bounty): submit work (on-chain anchor) + withdraw submission (#649)
Benjtalkshow Jun 25, 2026
d03d1a5
feat(bounty): builder "my bounties" activity + rewards receipt (#651)
Benjtalkshow Jun 25, 2026
6f46ea7
ci: auto-close linked issues on merge to any base branch (#652)
Benjtalkshow Jun 25, 2026
63922cb
feat(bounty): codegen refresh + retire hand-typed participant casts (…
Benjtalkshow Jun 25, 2026
348b8d8
feat: add template selection to hackathon generation dialog with new …
0xdevcollins Jun 25, 2026
53daf07
Merge branch 'feat/t-replace' of github.com:boundlessfi/boundless int…
0xdevcollins Jun 25, 2026
1a8b26c
feat(bounty): submission page, marketplace redesign, and organizer re…
Benjtalkshow Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "boundless-v1",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"port": 3000
}
]
}
10 changes: 4 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,10 @@ NEXT_PUBLIC_GOOGLE_CLIENT_ID=""
NEXT_PUBLIC_HORIZON_PUBLIC_URL="https://horizon.stellar.org"
NEXT_PUBLIC_HORIZON_TESTNET_URL="https://horizon-testnet.stellar.org"
NEXT_PUBLIC_STELLAR_NETWORK="testnet"
# Whitelisted USDC SAC (Soroban contract C-address) used as the escrow tokenAddress.
# Must match the boundless-events contract's whitelisted token (see backend admin runbook).
NEXT_PUBLIC_USDC_TOKEN_CONTRACT_TESTNET="CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA"
NEXT_PUBLIC_USDC_TOKEN_CONTRACT_PUBLIC=""
NEXT_PUBLIC_TRUSTLESS_WORK_API_KEY=""
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="your_wallet_connect_project_id"
# Error reporting (optional). When set, errors are sent to Sentry.
NEXT_PUBLIC_SENTRY_DSN=""
SENTRY_DSN=""
SENTRY_ORG=""
SENTRY_PROJECT="boundless-next"
SENTRY_AUTH_TOKEN="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"
NODE_ENV="dev"
84 changes: 84 additions & 0 deletions .github/workflows/close-linked-issues.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Close Linked Issues

# Auto-close issues referenced with Closes/Fixes/Resolves #N when a PR merges.
#
# GitHub's built-in auto-close only fires for PRs merged into the default branch
# (main). This repo's feature PRs merge into integration branches such as
# feat/t-replace, so linked issues are otherwise left open. This workflow closes
# them on any base branch.
#
# pull_request_target runs in the base-repo context, so it has an issues:write
# token even for PRs opened from forks (the normal pull_request event would get
# a read-only token). It never checks out or runs PR head code, so it is safe.

on:
pull_request_target:
types: [closed]

permissions:
issues: write
contents: read

jobs:
close-linked-issues:
name: Close linked issues
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- name: Close issues referenced in the PR body
uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const body = pr.body || '';

// Match "<keyword> #123" / "<keyword>: #123", keyword case-insensitive.
const keyword = '(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)';
const re = new RegExp(`${keyword}\\s*:?\\s+#(\\d+)`, 'gi');

const numbers = new Set();
for (const m of body.matchAll(re)) {
numbers.add(Number(m[1]));
}

if (numbers.size === 0) {
core.info('No "Closes/Fixes/Resolves #N" references found in the PR body.');
return;
}

for (const issue_number of numbers) {
try {
const { data: issue } = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
});

// Skip PRs (the API treats PRs as issues) and already-closed issues.
if (issue.pull_request) {
core.info(`#${issue_number} is a pull request, skipping.`);
continue;
}
if (issue.state === 'closed') {
core.info(`#${issue_number} is already closed, skipping.`);
continue;
}

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
body: `Closed by #${pr.number} (merged into \`${pr.base.ref}\`).`,
});
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
state: 'closed',
state_reason: 'completed',
});
core.info(`Closed #${issue_number}.`);
} catch (err) {
core.warning(`Could not close #${issue_number}: ${err.message}`);
}
}
21 changes: 6 additions & 15 deletions .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1,23 +1,14 @@

#!/usr/bin/env sh
set -e

echo "🚀 Running pre-push checks..."

# Run all tests (if you have them)
# echo "🧪 Running tests..."
# npm test

# Run security audit
echo "🔒 Running security audit..."
npm audit --omit=dev --audit-level=high

# Run build check one more time
# echo "🏗️ Final build check..."
# npm run build
echo "🔒 Auditing dependencies (non-blocking)..."
npm audit --omit=dev --audit-level=high || true

# Check for any uncommitted changes
if ! git diff-index --quiet HEAD --; then
echo "⚠️ Warning: You have uncommitted changes."
echo " Consider committing them before pushing."
echo "⚠️ You have uncommitted changes — they won't be included in this push."
fi

echo "✅ Pre-push checks completed!"
echo "✅ Pre-push checks passed!"
22 changes: 22 additions & 0 deletions app/(landing)/bounties/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountyDetail from '@/components/bounties/detail/BountyDetail';

export const metadata: Metadata = generatePageMetadata('bounties');

interface BountyDetailPageProps {
params: Promise<{ id: string }>;
}

export default async function BountyDetailPageRoute({
params,
}: BountyDetailPageProps) {
const { id } = await params;

return (
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountyDetail id={id} />
</div>
);
}
22 changes: 22 additions & 0 deletions app/(landing)/bounties/[id]/submit/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountySubmitGate from '@/components/bounties/detail/submit/BountySubmitGate';

export const metadata: Metadata = generatePageMetadata('bounties');

interface BountySubmitPageProps {
params: Promise<{ id: string }>;
}

export default async function BountySubmitPageRoute({
params,
}: BountySubmitPageProps) {
const { id } = await params;

return (
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountySubmitGate id={id} />
</div>
);
}
16 changes: 7 additions & 9 deletions app/(landing)/bounties/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { redirect } from 'next/navigation';
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountiesPage from '@/components/bounties/marketplace/BountiesPage';

export const metadata: Metadata = generatePageMetadata('grants');
export const metadata: Metadata = generatePageMetadata('bounties');

const GrantPage = () => {
redirect('/coming-soon');
export default function BountiesPageRoute() {
return (
<div className='mx-auto mt-10 max-w-[1440px] px-5 py-5 text-center text-4xl font-bold text-white md:px-[50px] lg:px-[100px]'>
Bounties Page
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountiesPage />
</div>
);
};

export default GrantPage;
}
Loading
Loading