rc77-money-engine/
├── docker-compose.yml
├── bitcoind/
│ └── Dockerfile
├── stratum-server/
│ └── Dockerfile
├── bridge-core/
│ ├── Dockerfile
│ └── src/index.js
├── treasury-engine/
│ ├── Dockerfile
│ └── src/main.go
├── api-server/
│ ├── Dockerfile
│ └── src/index.js
├── dashboard/
│ ├── Dockerfile
│ └── src/components/VaultStatus.jsx
├── nginx/
│ └── default.conf
└── README.md
version: "3.9"
services:
bitcoind:
image: ruimarinho/bitcoin-core:26.0
container_name: rc77-bitcoind
environment:
BITCOIN_RPC_USER: rc77admin
BITCOIN_RPC_PASSWORD: SuperSecureVaultKey77
volumes:
- ./bitcoind/data:/home/bitcoin/.bitcoin
ports:
- "8332:8332" # RPC
- "8333:8333" # P2P
restart: unless-stopped
stratum-server:
image: ckpool/ckpool:latest
container_name: rc77-stratum
ports:
- "3333:3333" # Stratum port
depends_on:
- bitcoind
restart: unless-stopped
bridge-core:
build: ./bridge-core
container_name: rc77-bridge
environment:
WBITC_CONTRACT:
"f6ac7396c971b5d5666703c35f195d5a3346f6a2bb27de8aab64c6324e40aafbi0”
PRIVATE_KEY: "L3EGEaHbpBasXTRiWiUidi8pCXfZSmUC9QiuVPq2N5rZowozKznh”,
RPC_URL: "https://mainnet.infura.io/v3/< f237d59b82da405da67dd0f4c56e68d2 >"
depends_on:
- bitcoind
restart: unless-stopped
treasury-engine:
build: ./treasury-engine
container_name: rc77-treasury
environment:
WBITC_CONTRACT: "
f6ac7396c971b5d5666703c35f195d5a3346f6a2bb27de8aab64c6324e40aafbi0”
RC77_CONTRACT: "
629eae99df6027e9453f8334b26d3060576f33e11a37fedbc5521ef6979289abi0”
TREASURY_WALLET: " 0x9d79821be713159ec1b69720794fa424d53e7949”
PRIVATE_KEY: " L3EGEaHbpBasXTRiWiUidi8pCXfZSmUC9QiuVPq2N5rZowozKznh”
RPC_URL: "https://mainnet.infura.io/v3/< f237d59b82da405da67dd0f4c56e68d2 >"
depends_on:
- bridge-core
restart: unless-stopped
api-server:
build: ./api-server
container_name: rc77-api
ports:
- "4000:4000"
depends_on:
- treasury-engine
restart: unless-stopped
dashboard:
build: ./dashboard
container_name: rc77-dashboard
ports:
- "3000:3000"
depends_on:
- api-server
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: rc77-nginx
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
- "443:443"
depends_on:
- dashboard
restart: unless-stopped
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title verifyvault.eth Bridge
* @dev ERC20 wBITC token with”0x9d79821be713159ec1b69720794fa424d53e7949”, mint/redeem logic, and fee tracking.
*/
contract verifyvault.eth Bridge is ERC20, Ownable {
address public constant btcVault = 0xbc1q2ul0yunxnchlzwuu6l9l8k6rt0685wllzgfdmk;
address public constant feeWallet = 0xbc1quru93s28hu7cu8l3eqqdl42guysh32krcdrxg;
address public multiSig;
uint256 public constant mintFeeBps = 50; // 0.5%
uint256 public constant redeemFeeBps = 50; // 0.5%
uint256 public totalMintFees;
uint256 public totalRedeemFees;
event Mint(address indexed user, uint256 btcAmount, uint256 wbitcAmount, uint256 fee);
event Redeem(address indexed user, uint256 wbitcAmount, uint256 btcAmount, uint256 fee);
event MultiSigChanged(address indexed previousMultiSig, address indexed newMultiSig);
modifier onlyMultiSig() {
require(msg.sender == multiSig, "Not authorized: multi-sig only");
constructor(address _multiSig) ERC20("Wrapped Bitcoin", "wBITC") {
require(_multiSig != address(0), "Invalid multi-sig address");
multiSig = _multiSig;
transferOwnership(_multiSig);
}
function setMultiSig(address newMultiSig) external onlyMultiSig {
require(newMultiSig != address(0), "Invalid multi-sig address");
emit MultiSigChanged(multiSig, newMultiSig);
multiSig = newMultiSig;
}
function mintWBITC(address user, uint256 btcAmount) external onlyMultiSig {
require(user != address(0), "Invalid user address");
require(btcAmount > 0, "BTC amount must be > 0");
uint256 fee = (btcAmount * mintFeeBps) / 10000;
uint256 mintAmount = btcAmount - fee;
totalMintFees += fee;
_mint(user, mintAmount);
emit Mint(user, btcAmount, mintAmount, fee);
}
function redeemBTC(address user, uint256 wbitcAmount) external onlyMultiSig {
require(user != address(0), "Invalid user address");
require(wbitcAmount > 0, "wBITC amount must be > 0");
uint256 fee = (wbitcAmount * redeemFeeBps) / 10000;
uint256 btcAmount = wbitcAmount - fee;
totalRedeemFees += fee;
_burn(user, wbitcAmount);
emit Redeem(user, wbitcAmount, btcAmount, fee);
}
function getTotalFees() external view returns (uint256 mintFees, uint256 redeemFees) {
return (totalMintFees, totalRedeemFees);
}
}
package main
import (
"fmt"
"log"
"time"
"rc77/eth"
)
func main() {
fmt.Println("🚀 RC77 Treasury Engine started...")
for {
err := eth.SwapWBITCToRC77()
if err != nil {
log.Printf("Swap failed: %v\n", err)
} else {
log.Println("✅ Swap completed. RC77 deposited in treasury.")
}
time.Sleep(1 * time.Hour)
}
}
version: "3.9"
services:
bitcoind:
image: ruimarinho/bitcoin-core:26.0
container_name: rc77-bitcoind
environment:
BITCOIN_RPC_USER: ${BITCOIN_RPC_USER}
BITCOIN_RPC_PASSWORD: ${BITCOIN_RPC_PASSWORD}
volumes:
- ./bitcoind/data:/home/bitcoin/.bitcoin
ports:
- "8332:8332" # RPC
- "8333:8333" # P2P
restart: unless-stopped
stratum-server:
image: ckpool/ckpool:latest
container_name: rc77-stratum
ports:
- "3333:3333" # Stratum port
depends_on:
- bitcoind
restart: unless-stopped
bridge-core:
build: ./bridge-core
container_name: rc77-bridge
environment:
WBITC_CONTRACT: ${WBITC_CONTRACT}
PRIVATE_KEY: ${PRIVATE_KEY}
RPC_URL: ${RPC_URL}
depends_on:
- bitcoind
restart: unless-stopped
treasury-engine:
build: ./treasury-engine
container_name: rc77-treasury
environment:
WBITC_CONTRACT: ${WBITC_CONTRACT}
RC77_CONTRACT: ${RC77_CONTRACT}
TREASURY_WALLET: ${TREASURY_WALLET}
PRIVATE_KEY: ${PRIVATE_KEY}
RPC_URL: ${RPC_URL}
depends_on:
- bridge-core
restart: unless-stopped
api-server:
build: ./api-server
container_name: rc77-api
ports:
- "4000:4000"
depends_on:
- treasury-engine
restart: unless-stopped
dashboard:
build: ./dashboard
container_name: rc77-dashboard
ports:
- "3000:3000"
depends_on:
- api-server
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: rc77-nginx
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
- "443:443"
depends_on:
- dashboard
restart: unless-stopped
# .env
BITCOIN_RPC_USER=rc77admin
BITCOIN_RPC_PASSWORD=SuperSecureVaultKey77
WBITC_CONTRACT=f6ac7396c971b5d5666703c35f195d5a3346f6a2bb27de8aab64c6324e40aafbi0
RC77_CONTRACT=629eae99df6027e9453f8334b26d3060576f33e11a37fedbc5521ef6979289abi0
TREASURY_WALLET=0x9d79821be713159ec1b69720794fa424d53e7949
PRIVATE_KEY=L3EGEaHbpBasXTRiWiUidi8pCXfZSmUC9QiuVPq2N5rZowozKznh
RPC_URL=https://mainnet.infura.io/v3/f237d59b82da405da67dd0f4c56e68d2
BITCOIN_RPC_USER=rc77admin
BITCOIN_RPC_PASSWORD=SuperSecureVaultKey77
WBITC_CONTRACT=f6ac7396c971b5d5666703c35f195d5a3346f6a2bb27de8aab64c6324e40aafbi0
RC77_CONTRACT=629eae99df6027e9453f8334b26d3060576f33e11a37fedbc5521ef6979289abi0
TREASURY_WALLET=0x9d79821be713159ec1b69720794fa424d53e7949
PRIVATE_KEY=L3EGEaHbpBasXTRiWiUidi8pCXfZSmUC9QiuVPq2N5rZowozKznh
RPC_URL=https://mainnet.infura.io/v3/f237d59b82da405da67dd0f4c56e68d2
package eth
import "errors"
func SwapWBITCToRC77() error {
// Replace with actual swap logic later
return errors.New("Mock swap logic not implemented")
}
module rc77
go 1.20
import React from 'react';
import ReactDOM from 'react-dom';
import VaultStatus from './components/VaultStatus';
ReactDOM.render(