Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions ASSIGNMENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Vault Contract Assignment

## Overview
This is the Vault contract assignment (as-w4-d1). The Vault contract provides functionality for [contract purpose].

## Setup
1. Install dependencies: `npm install`
2. Configure hardhat: See `hardhat.config.ts`
3. Run tests: `npm test`

## Contract Details
- **Location**: `Assignment/solidity-assignment7/contracts/vault/`
- **Language**: Solidity

## Testing
```bash
npm test
```

## Deployment
```bash
npx hardhat run scripts/deploy.ts
```
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"_format": "hh3-sol-build-info-1",
"id": "solc-0_8_28-20629223a15770955c9b8840e528f9d58e5be6d8",
"solcVersion": "0.8.28",
"solcLongVersion": "0.8.28+commit.7893614a",
"userSourceNameMap": {
"contracts/vault.sol": "project/contracts/vault.sol"
},
"input": {
"language": "Solidity",
"settings": {
"evmVersion": "cancun",
"outputSelection": {
"*": {
"": [
"ast"
],
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
]
}
},
"remappings": []
},
"sources": {
"project/contracts/vault.sol": {
"content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\ncontract TimelockedSavingsVault {\n struct Vault {\n uint256 amount;\n uint256 unlockTime;\n bool active;\n }\n\n uint256 public constant LOCK_DURATION = 24 hours; // Fixed lock duration for every deposit.\n\n mapping(address => Vault) private vaults;\n\n event Deposit(address indexed user, uint256 amount, uint256 unlockTime);\n event Withdraw(address indexed user, uint256 amount);\n\n function deposit(uint256 unlockTime) external payable {\n require(msg.value > 0, \"Deposit must be > 0\");\n require(unlockTime == block.timestamp + 24 hours, \"Unlock time must be exactly 24h\");\n require(!vaults[msg.sender].active, \"Vault already active\");\n\n vaults[msg.sender] = Vault({\n amount: msg.value,\n unlockTime: unlockTime,\n active: true\n });\n\n emit Deposit(msg.sender, msg.value, unlockTime);\n }\n\n function withdraw() external {\n Vault storage v = vaults[msg.sender];\n require(v.active, \"No active vault\");\n require(block.timestamp >= v.unlockTime, \"Too early\");\n uint256 amount = v.amount;\n require(amount > 0, \"No balance\");\n\n v.amount = 0;\n v.active = false;\n v.unlockTime = 0;\n\n (bool success, ) = payable(msg.sender).call{value: amount}(\"\");\n require(success, \"Withdraw failed\");\n emit Withdraw(msg.sender, amount);\n }\n\n function getVault(address user) external view returns (uint256 amount, uint256 unlockTime, bool active) {\n Vault storage v = vaults[user];\n return (v.amount, v.unlockTime, v.active);\n }\n\n receive() external payable {\n revert(\"Direct ETH not allowed\");\n }\n\n fallback() external payable {\n revert(\"Direct ETH not allowed\");\n }\n}\n"
}
}
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
{
"_format": "hh3-artifact-1",
"contractName": "TimelockedSavingsVault",
"sourceName": "contracts/vault.sol",
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "unlockTime",
"type": "uint256"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Withdraw",
"type": "event"
},
{
"stateMutability": "payable",
"type": "fallback"
},
{
"inputs": [],
"name": "LOCK_DURATION",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "unlockTime",
"type": "uint256"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "getVault",
"outputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "unlockTime",
"type": "uint256"
},
{
"internalType": "bool",
"name": "active",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6080604052348015600e575f5ffd5b50610bb98061001c5f395ff3fe608060405260043610610042575f3560e01c80630eb9af38146100bd5780633ccfd60b146100fb578063485d383414610111578063b6b55f251461013b57610082565b36610082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161007990610667565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b490610667565b60405180910390fd5b3480156100c8575f5ffd5b506100e360048036038101906100de91906106e3565b610157565b6040516100f293929190610740565b60405180910390f35b348015610106575f5ffd5b5061010f6101c1565b005b34801561011c575f5ffd5b50610125610407565b6040516101329190610775565b60405180910390f35b610155600480360381019061015091906107b8565b61040e565b005b5f5f5f5f5f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f01548160010154826002015f9054906101000a900460ff16935093509350509193909250565b5f5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806002015f9054906101000a900460ff16610250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102479061082d565b60405180910390fd5b8060010154421015610297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028e90610895565b60405180910390fd5b5f815f015490505f81116102e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d7906108fd565b60405180910390fd5b5f825f01819055505f826002015f6101000a81548160ff0219169083151502179055505f82600101819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161033190610948565b5f6040518083038185875af1925050503d805f811461036b576040519150601f19603f3d011682016040523d82523d5f602084013e610370565b606091505b50509050806103b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ab906109a6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040516103fa9190610775565b60405180910390a2505050565b6201518081565b5f3411610450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044790610a0e565b60405180910390fd5b620151804261045f9190610a59565b81146104a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049790610ad6565b60405180910390fd5b5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f9054906101000a900460ff161561052c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052390610b3e565b60405180910390fd5b6040518060600160405280348152602001828152602001600115158152505f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a153483604051610602929190610b5c565b60405180910390a250565b5f82825260208201905092915050565b7f44697265637420455448206e6f7420616c6c6f776564000000000000000000005f82015250565b5f61065160168361060d565b915061065c8261061d565b602082019050919050565b5f6020820190508181035f83015261067e81610645565b9050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106b282610689565b9050919050565b6106c2816106a8565b81146106cc575f5ffd5b50565b5f813590506106dd816106b9565b92915050565b5f602082840312156106f8576106f7610685565b5b5f610705848285016106cf565b91505092915050565b5f819050919050565b6107208161070e565b82525050565b5f8115159050919050565b61073a81610726565b82525050565b5f6060820190506107535f830186610717565b6107606020830185610717565b61076d6040830184610731565b949350505050565b5f6020820190506107885f830184610717565b92915050565b6107978161070e565b81146107a1575f5ffd5b50565b5f813590506107b28161078e565b92915050565b5f602082840312156107cd576107cc610685565b5b5f6107da848285016107a4565b91505092915050565b7f4e6f20616374697665207661756c7400000000000000000000000000000000005f82015250565b5f610817600f8361060d565b9150610822826107e3565b602082019050919050565b5f6020820190508181035f8301526108448161080b565b9050919050565b7f546f6f206561726c7900000000000000000000000000000000000000000000005f82015250565b5f61087f60098361060d565b915061088a8261084b565b602082019050919050565b5f6020820190508181035f8301526108ac81610873565b9050919050565b7f4e6f2062616c616e6365000000000000000000000000000000000000000000005f82015250565b5f6108e7600a8361060d565b91506108f2826108b3565b602082019050919050565b5f6020820190508181035f830152610914816108db565b9050919050565b5f81905092915050565b50565b5f6109335f8361091b565b915061093e82610925565b5f82019050919050565b5f61095282610928565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f610990600f8361060d565b915061099b8261095c565b602082019050919050565b5f6020820190508181035f8301526109bd81610984565b9050919050565b7f4465706f736974206d757374206265203e2030000000000000000000000000005f82015250565b5f6109f860138361060d565b9150610a03826109c4565b602082019050919050565b5f6020820190508181035f830152610a25816109ec565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a638261070e565b9150610a6e8361070e565b9250828201905080821115610a8657610a85610a2c565b5b92915050565b7f556e6c6f636b2074696d65206d7573742062652065786163746c7920323468005f82015250565b5f610ac0601f8361060d565b9150610acb82610a8c565b602082019050919050565b5f6020820190508181035f830152610aed81610ab4565b9050919050565b7f5661756c7420616c7265616479206163746976650000000000000000000000005f82015250565b5f610b2860148361060d565b9150610b3382610af4565b602082019050919050565b5f6020820190508181035f830152610b5581610b1c565b9050919050565b5f604082019050610b6f5f830185610717565b610b7c6020830184610717565b939250505056fea26469706673582212206e7089b98a959fb43d7f15a3780ed05308078d0f0a104edf440a588e08286bd764736f6c634300081c0033",
"deployedBytecode": "0x608060405260043610610042575f3560e01c80630eb9af38146100bd5780633ccfd60b146100fb578063485d383414610111578063b6b55f251461013b57610082565b36610082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161007990610667565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b490610667565b60405180910390fd5b3480156100c8575f5ffd5b506100e360048036038101906100de91906106e3565b610157565b6040516100f293929190610740565b60405180910390f35b348015610106575f5ffd5b5061010f6101c1565b005b34801561011c575f5ffd5b50610125610407565b6040516101329190610775565b60405180910390f35b610155600480360381019061015091906107b8565b61040e565b005b5f5f5f5f5f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f01548160010154826002015f9054906101000a900460ff16935093509350509193909250565b5f5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806002015f9054906101000a900460ff16610250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102479061082d565b60405180910390fd5b8060010154421015610297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028e90610895565b60405180910390fd5b5f815f015490505f81116102e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d7906108fd565b60405180910390fd5b5f825f01819055505f826002015f6101000a81548160ff0219169083151502179055505f82600101819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161033190610948565b5f6040518083038185875af1925050503d805f811461036b576040519150601f19603f3d011682016040523d82523d5f602084013e610370565b606091505b50509050806103b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ab906109a6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040516103fa9190610775565b60405180910390a2505050565b6201518081565b5f3411610450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044790610a0e565b60405180910390fd5b620151804261045f9190610a59565b81146104a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049790610ad6565b60405180910390fd5b5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f9054906101000a900460ff161561052c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052390610b3e565b60405180910390fd5b6040518060600160405280348152602001828152602001600115158152505f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a153483604051610602929190610b5c565b60405180910390a250565b5f82825260208201905092915050565b7f44697265637420455448206e6f7420616c6c6f776564000000000000000000005f82015250565b5f61065160168361060d565b915061065c8261061d565b602082019050919050565b5f6020820190508181035f83015261067e81610645565b9050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106b282610689565b9050919050565b6106c2816106a8565b81146106cc575f5ffd5b50565b5f813590506106dd816106b9565b92915050565b5f602082840312156106f8576106f7610685565b5b5f610705848285016106cf565b91505092915050565b5f819050919050565b6107208161070e565b82525050565b5f8115159050919050565b61073a81610726565b82525050565b5f6060820190506107535f830186610717565b6107606020830185610717565b61076d6040830184610731565b949350505050565b5f6020820190506107885f830184610717565b92915050565b6107978161070e565b81146107a1575f5ffd5b50565b5f813590506107b28161078e565b92915050565b5f602082840312156107cd576107cc610685565b5b5f6107da848285016107a4565b91505092915050565b7f4e6f20616374697665207661756c7400000000000000000000000000000000005f82015250565b5f610817600f8361060d565b9150610822826107e3565b602082019050919050565b5f6020820190508181035f8301526108448161080b565b9050919050565b7f546f6f206561726c7900000000000000000000000000000000000000000000005f82015250565b5f61087f60098361060d565b915061088a8261084b565b602082019050919050565b5f6020820190508181035f8301526108ac81610873565b9050919050565b7f4e6f2062616c616e6365000000000000000000000000000000000000000000005f82015250565b5f6108e7600a8361060d565b91506108f2826108b3565b602082019050919050565b5f6020820190508181035f830152610914816108db565b9050919050565b5f81905092915050565b50565b5f6109335f8361091b565b915061093e82610925565b5f82019050919050565b5f61095282610928565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f610990600f8361060d565b915061099b8261095c565b602082019050919050565b5f6020820190508181035f8301526109bd81610984565b9050919050565b7f4465706f736974206d757374206265203e2030000000000000000000000000005f82015250565b5f6109f860138361060d565b9150610a03826109c4565b602082019050919050565b5f6020820190508181035f830152610a25816109ec565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a638261070e565b9150610a6e8361070e565b9250828201905080821115610a8657610a85610a2c565b5b92915050565b7f556e6c6f636b2074696d65206d7573742062652065786163746c7920323468005f82015250565b5f610ac0601f8361060d565b9150610acb82610a8c565b602082019050919050565b5f6020820190508181035f830152610aed81610ab4565b9050919050565b7f5661756c7420616c7265616479206163746976650000000000000000000000005f82015250565b5f610b2860148361060d565b9150610b3382610af4565b602082019050919050565b5f6020820190508181035f830152610b5581610b1c565b9050919050565b5f604082019050610b6f5f830185610717565b610b7c6020830184610717565b939250505056fea26469706673582212206e7089b98a959fb43d7f15a3780ed05308078d0f0a104edf440a588e08286bd764736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/vault.sol",
"buildInfoId": "solc-0_8_28-20629223a15770955c9b8840e528f9d58e5be6d8"
}
Loading