Skip to content

Instantly share code, notes, and snippets.

@satyambnsal
Last active September 5, 2025 14:37
Show Gist options
  • Select an option

  • Save satyambnsal/381040fa038fdd2235fd06f4da20980b to your computer and use it in GitHub Desktop.

Select an option

Save satyambnsal/381040fa038fdd2235fd06f4da20980b to your computer and use it in GitHub Desktop.
verify_proof
import { assignDiscordRole } from '../../utils/discord.js';
import example_circuit from '../../shared/example_circuit.json' with { type: 'json' };
import { UltraHonkBackend } from '@aztec/bb.js';
const backend = new UltraHonkBackend(example_circuit.bytecode);
export default async function discordRoutes(fastify) {
fastify.route({
method: 'POST',
url: '/assign-role',
handler: async (request, reply) => {
const { userId, guildId, discordRoleId, base64Proof, publicInputs } =
request.body;
const walletAddress = publicInputs[0];
fastify.log.info('[ASSIGN-ROLE] Incoming request:', request.body);
if (!userId || !walletAddress) {
fastify.log.warn('[ASSIGN-ROLE] Missing userId or walletAddress');
return reply.code(400).send({ error: 'Missing required parameters' });
}
if (!guildId || !discordRoleId) {
fastify.log.error('[ASSIGN-ROLE] Missing Discord config', {
guildId,
discordRoleId
});
return reply.code(500).send({ error: 'Server configuration error' });
}
if (!base64Proof || !publicInputs) {
fastify.log.warn('[ASSIGN-ROLE] Missing proof or public inputs');
return reply.code(400).send({ error: 'Missing proof data' });
}
try {
fastify.log.info('[ASSIGN-ROLE] Verifying proof...');
const uint8Proof = Buffer.from(base64Proof, 'base64');
const proof = { publicInputs, proof: uint8Proof };
const isValid = await backend.verifyProof(proof);
if (!isValid) {
fastify.log.warn('[ASSIGN-ROLE] Proof verification failed');
return reply.code(403).send({
success: false,
isValid: false,
message: 'Invalid proof. Role not assigned.'
});
}
fastify.log.info('[ASSIGN-ROLE] Proof verified successfully');
fastify.log.info('[ASSIGN-ROLE] Assigning role...');
await assignDiscordRole(userId, guildId, discordRoleId);
fastify.log.info('[ASSIGN-ROLE] Role assigned successfully');
return reply.code(200).send({
success: true,
isValid: true,
message: 'Proof verified and role assigned successfully'
});
} catch (err) {
fastify.log.error('[ASSIGN-ROLE] Error:', err);
return reply.code(500).send({
success: false,
error: `Server error: ${err.message || 'Unknown error'}`
});
}
}
});
}
/*
Example usage
### Assign Discord Role(Indexer)
POST http://localhost:3004/discord/assign-role
Content-Type: application/json
{
"userId": "952588145189339186",
"walletAddress": "0x2d2598a2b9b87b4837109a8375ec5e5f884614f96549c847bf5414e3bdef3413",
"guildId": "1352265678824144936",
"discordRoleId": "1354831853491716281",
"publicInputs": [
"0x2d2598a2b9b87b4837109a8375ec5e5f884614f96549c847bf5414e3bdef3413",
"0x16edd70efb1138a9d15f5cf188ac18042e0d81f8e1b685bc409520b0de7adee6",
"0x0000000000000000000000000000000000000000000000000000000000000001",
"0x1b63da2755cb9622c73663ba0f096541f73bc8570db88437795a38e4a3da52f4"
],
"base64Proof": "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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"
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment