Skip to content

Instantly share code, notes, and snippets.

View pmatsinopoulos's full-sized avatar
💻
Programming

Panos Matsinopoulos pmatsinopoulos

💻
Programming
View GitHub Profile
@pmatsinopoulos
pmatsinopoulos / threads_increase_balance_use_mutex.rb
Created April 12, 2025 09:43
Using Mutex to Give Work to Threads
user = User.find_by!(email: "[email protected]")
mutex = Thread::Mutex.new
threads = []
5.times do
threads << Thread.new do
CalculateUserBalanceJob.perform_now(user.id, mutex)
end
end
@pmatsinopoulos
pmatsinopoulos / threads_increase_balance.rb
Created April 12, 2025 09:24
Threads Increase Balance for Thread-Process-Safe Code in Ruby on Raiils
user = User.find_by!(email: "[email protected]")
threads = []
5.times do
threads << Thread.new do
CalculateUserBalanceJob.perform_now(user.id)
end
end
threads.each(&:join)
@pmatsinopoulos
pmatsinopoulos / user.rb
Created April 12, 2025 09:02
User model for Thread-and-Process-safe Sidekiq Job
class User < ApplicationRecord
has_one :user_balance, dependent: :destroy
validates :email, presence: true, uniqueness: { case_sensitive: false }
after_create :create_user_balance
private
def create_user_balance
@pmatsinopoulos
pmatsinopoulos / calculate_user_balance_job.rb
Last active April 12, 2025 09:17
A Sidekiq job that calculates a user balance.
class CalculateUserBalanceJob < ApplicationJob
queue_as :default
def perform(user_id)
user = User.find(user_id)
puts "#{Thread.current.object_id} -> Calculating balance for user: #{user.email}"
user_balance = user.user_balance
@pmatsinopoulos
pmatsinopoulos / user_balance.rb
Last active April 12, 2025 09:04
UserBalance model for the blog post on Singleton Sidekiq Job
class UserBalance < ApplicationRecord
belongs_to :user, inverse_of: :user_balance
validates :user_id, uniqueness: true
validates :balance, numericality: { greater_than_or_equal_to: 0 }
end
@pmatsinopoulos
pmatsinopoulos / buyTier1.sol
Created November 24, 2024 17:38
Buy Tier1 Business Rules for TalentCommunitySale
require(saleActive, "TalentCommunitySale: Sale is not active");
require(
paymentToken.allowance(msg.sender, address(this)) >= 100 * 10**tokenDecimals,
"TalentCommunitySale: Insufficient allowance"
);
require(tier1Bought < TIER1_MAX_BUYS, "TalentCommunitySale: Tier 1 sold out");
require(!listOfBuyers[msg.sender], "TalentCommunitySale: Address already bought");
require(paymentToken.transferFrom(msg.sender, receivingWallet, 100 * 10**tokenDecimals), "Transfer failed");
@pmatsinopoulos
pmatsinopoulos / main.ts
Created July 9, 2024 13:08
Farcaster KeyRegistry List Connected Apps of a Farcaster ID
/*
This script lists the Farcaster client apps that a Farcaster account has
registered as client apps. Farcaster apps are _account keys_ registered
on-chain, in Optimism. We are using KeyRegistry contract to read the
number and keys of an FID.
*/
import { ethers } from "hardhat";
import loadContractAbi from "./loadContractAbi";
const KEY_REGISTRY_CONTRACT_ADDRESS =
@pmatsinopoulos
pmatsinopoulos / KeyRegistry.json
Last active July 9, 2024 13:37
Farcaster KeyRegistry Contract ABI
[
{
"inputs": [
{
"internalType": "address",
"name": "_idRegistry",
"type": "address"
},
{
"internalType": "address",
@pmatsinopoulos
pmatsinopoulos / hardhat.config.ts
Created July 9, 2024 12:43
Hardhat configuration to connect to optimism via Alchemy
import { HardhatUserConfig, vars } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
const ALCHEMY_API_KEY = vars.get("ALCHEMY_API_KEY");
const ACCOUNT_PRIVATE_KEY = vars.get("ACCOUNT_PRIVATE_KEY")
const config: HardhatUserConfig = {
solidity: "0.8.24",
networks: {
optimism: {
@pmatsinopoulos
pmatsinopoulos / Box.test.js
Created June 15, 2024 11:27
test/contracts/Box.test.js used in OpenZeppelin Tutorial
// Load dependencies
const { expect } = require("chai");
require("@nomiclabs/hardhat-ethers");
require("@nomicfoundation/hardhat-chai-matchers");
// Start test block
describe("Box", function () {
const value = 42n;