This commit is contained in:
2026-04-05 00:43:23 +05:30
commit 8be37d3e92
425 changed files with 101853 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract AgreementRegistry {
struct Agreement {
bytes32 agreementHash;
string featureType;
string summary;
uint256 timestamp;
address registeredBy;
}
mapping(string => Agreement) public agreements; // negotiationId => Agreement
string[] public agreementIds;
event AgreementRegistered(
string indexed negotiationId,
bytes32 agreementHash,
string featureType,
string summary,
uint256 timestamp
);
function registerAgreement(
string calldata negotiationId,
bytes32 agreementHash,
string calldata featureType,
string calldata summary
) external {
agreements[negotiationId] = Agreement({
agreementHash: agreementHash,
featureType: featureType,
summary: summary,
timestamp: block.timestamp,
registeredBy: msg.sender
});
agreementIds.push(negotiationId);
emit AgreementRegistered(
negotiationId, agreementHash, featureType, summary, block.timestamp
);
}
function getAgreement(string calldata negotiationId)
external view returns (Agreement memory)
{
return agreements[negotiationId];
}
function totalAgreements() external view returns (uint256) {
return agreementIds.length;
}
}

View File

@@ -0,0 +1,81 @@
"""
Deploy AgreementRegistry.sol to Polygon Amoy testnet using web3.py + native solc.
Run from project root: python3 contracts/deploy.py
"""
import sys, os, subprocess, json
sys.path.insert(0, 'backend')
from dotenv import load_dotenv
load_dotenv('.env')
from web3 import Web3
# ── Config ───────────────────────────────────────────────────────────────────
RPC_URL = os.getenv("POLYGON_RPC_URL", "https://rpc-amoy.polygon.technology/")
PRIVATE_KEY = os.getenv("POLYGON_PRIVATE_KEY", "")
CHAIN_ID = 80002
w3 = Web3(Web3.HTTPProvider(RPC_URL))
account = w3.eth.account.from_key(PRIVATE_KEY)
print(f"Connected : {w3.is_connected()}")
print(f"Address : {account.address}")
print(f"Balance : {w3.from_wei(w3.eth.get_balance(account.address), 'ether')} POL")
print(f"Chain ID : {w3.eth.chain_id}")
# ── Compile with native solc (installed via Homebrew) ────────────────────────
sol_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "AgreementRegistry.sol")
print(f"\nCompiling {sol_path} ...")
result = subprocess.run(
["solc", "--combined-json", "abi,bin", "--optimize", sol_path],
capture_output=True, text=True
)
if result.returncode != 0:
print(f"❌ Compilation failed:\n{result.stderr}")
sys.exit(1)
compiled = json.loads(result.stdout)
key = list(compiled["contracts"].keys())[0] # e.g. "path:AgreementRegistry"
raw_abi = compiled["contracts"][key]["abi"]
abi = json.loads(raw_abi) if isinstance(raw_abi, str) else raw_abi
bytecode = compiled["contracts"][key]["bin"]
print(f"✅ Compiled successfully (contract key: {key})")
# ── Deploy ───────────────────────────────────────────────────────────────────
ContractFactory = w3.eth.contract(abi=abi, bytecode=bytecode)
gas_price = w3.eth.gas_price
tip = w3.to_wei(35, "gwei")
max_fee = gas_price + tip
print(f"\nDeploying ... (base gas: {w3.from_wei(gas_price, 'gwei'):.1f} gwei, tip: 35 gwei)")
tx = ContractFactory.constructor().build_transaction({
"from": account.address,
"nonce": w3.eth.get_transaction_count(account.address),
"gas": 800_000,
"maxFeePerGas": max_fee,
"maxPriorityFeePerGas": tip,
"chainId": CHAIN_ID,
})
signed = w3.eth.account.sign_transaction(tx, PRIVATE_KEY)
tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
print(f"Tx sent : 0x{tx_hash.hex()}")
print("Waiting for confirmation (~2 seconds) ...")
receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120)
contract_address = receipt.contractAddress
print(f"\n{'='*60}")
print(f"✅ CONTRACT DEPLOYED SUCCESSFULLY")
print(f"{'='*60}")
print(f"Contract Address : {contract_address}")
print(f"Transaction Hash : 0x{tx_hash.hex()}")
print(f"Block Number : {receipt.blockNumber}")
print(f"Gas Used : {receipt.gasUsed}")
print(f"Explorer : https://amoy.polygonscan.com/address/{contract_address}")
print(f"{'='*60}")
print(f"\n📋 Add this to your .env:")
print(f"AGREEMENT_CONTRACT_ADDRESS={contract_address}")