diff --git a/.github/ISSUE_TEMPLATE/verifier_reliability_bounty.md b/.github/ISSUE_TEMPLATE/verifier_reliability_bounty.md new file mode 100644 index 00000000..e9f9f0c7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/verifier_reliability_bounty.md @@ -0,0 +1,54 @@ +--- +name: Verifier Reliability Bounty +about: Template for creating verifier reliability bounties +title: '[PENDING ACTIVATION] Earn 1 USDC margin by posting a verifier reliability bounty' +labels: 'draft' +assignees: '' +--- + +## Activation state + +This is a replacement inventory draft. **Do not claim, sign, bond, fund a child, or start work yet.** + +It becomes an earning bounty only after this issue publishes all of the following from canonical Base-mainnet evidence: + +- one exact routed-V3 parent contract; +- full 2.01 USDC funding; +- BountyBecameClaimable; +- valid immutable terms; +- an executable routed-V3 child-preparation path; +- the pinned sandboxed_regression_v1 verifier path. + +## Intended earning loop + +After activation, the solver posts and fully funds one concrete 1.00 USDC verifier reliability coding child bounty. A different registered participant completes that child and receives canonical settlement. The parent then pays 2.00 USDC, leaving 1.00 USDC parent gross margin before gas or other optional costs. + +The activation workflow adds bounty, funded-live, and claimable-live labels only after every readiness check passes. A draft issue, label, transaction plan, signature, or transaction hash is not funding, claimability, completion, or payment. Only canonical BountySettled proves payment. + +Discovery feedback requested after activation: explain how you found the bounty, why you attempted it, and the single change that would make the loop easier to complete. + +## Activation checklist + +- [ ] Parent contract deployed on Base mainnet +- [ ] Contract funded with 2.01 USDC +- [ ] BountyBecameClaimable event emitted +- [ ] Immutable terms validated +- [ ] Child-preparation path verified +- [ ] Verifier path pinned +- [ ] Labels updated (bounty, funded-live, claimable-live) + +## Contract details + +**Parent contract address:** `TBD` + +**Funding transaction:** `TBD` + +**BountyBecameClaimable transaction:** `TBD` + +## Terms + +- Parent bounty value: 2.01 USDC +- Child bounty value: 1.00 USDC +- Expected margin: 1.00 USDC (before gas) +- Network: Base mainnet +- Verifier: sandboxed_regression_v1 diff --git a/.github/workflows/activate_bounty.yml b/.github/workflows/activate_bounty.yml new file mode 100644 index 00000000..14fc4827 --- /dev/null +++ b/.github/workflows/activate_bounty.yml @@ -0,0 +1,86 @@ +name: Activate Bounty + +on: + issue_comment: + types: [created] + +jobs: + activate: + if: contains(github.event.comment.body, '/activate') && contains(github.event.issue.labels.*.name, 'draft') + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Validate activation requirements + id: validate + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue; + const body = issue.body; + + const requiredFields = [ + 'Parent contract address:', + 'Funding transaction:', + 'BountyBecameClaimable transaction:' + ]; + + const missingFields = requiredFields.filter(field => + !body.includes(field) || body.includes(`${field} \`TBD\``) + ); + + if (missingFields.length > 0) { + core.setFailed(`Missing required fields: ${missingFields.join(', ')}`); + return false; + } + + return true; + + - name: Add activation labels + if: steps.validate.outputs.result == 'true' + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: ['bounty', 'funded-live', 'claimable-live'] + }); + + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + name: 'draft' + }); + + - name: Update issue title + if: steps.validate.outputs.result == 'true' + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue; + const newTitle = issue.title.replace('[PENDING ACTIVATION]', '[ACTIVE]'); + + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + title: newTitle + }); + + - name: Post activation comment + if: steps.validate.outputs.result == 'true' + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: '✅ Bounty activated! All requirements verified. This bounty is now claimable.' + });