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
Empty file added contracts/SimpleDao@0.0.1
Empty file.
104 changes: 67 additions & 37 deletions contracts/escrow_system.tolk
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
{/*
Below you will find an EscrowSystem contract that allows user to initialize an escrow, request funds, release funds, and cancel escrow.
The EscrowSystem struct is the main storage of the contract.
It contains:
- owner: address
- recipient: address
- amount: uint64
- isReleased: bool
- isRequested: bool

Your task it to fix the errors in the contract and make it work as expected.
fun loadEscrow(): EscrowSystem {
return EscrowSystem.fromCell(contract.getData());
}

Helpful Blueprint sdk commands:
- npx blueprint build - To build the contract
- npx blueprint test tests/EscrowSystem.spec.ts - To test the contract
*/}
fun storeEscrow(self: EscrowSystem) {
contract.setData(self);
}

tolk 1.1
// contracts/escrow_system.tolk
// EscrowSystem contract - fixed version

struct EscrowSystem {
owner: address;
Expand All @@ -25,80 +17,118 @@ struct EscrowSystem {
isRequested: bool;
}

fun EscrowSystem.load() {
static fun EscrowSystem.load(): EscrowSystem {
return EscrowSystem.fromCell(contract.getData());
}
fun EscrowSystem.store(self) {

static fun EscrowSystem.store(self: EscrowSystem) {
contract.setData(self);
}

struct (0xE3D2C1B4) InitializeEscrow {
queryId: uint32
recipient: address
amount: uint64
queryId: uint32;
recipient: address;
amount: uint64;
}
struct (0xF4E3D2C1) RequestFunds {
queryId: uint32
queryId: uint32;
}
struct (0xA1B2C3D4) ReleaseFunds {
queryId: uint32
queryId: uint32;
}
struct (0xB1C2D3E4) CancelEscrow {
queryId: uint32
queryId: uint32;
}

type MessageBody = RequestFunds & ReleaseFunds & CancelEscrow & InitializeEscrow
type MessageBody = InitializeEscrow | RequestFunds | ReleaseFunds | CancelEscrow;

fun onInternalMessage(in: InMessage) {
val msg = lazy MessageBody.fromSlice(in.body);

match (msg) {
InitializeEscrow => {
val payload = msg as InitializeEscrow;
var escrow = lazy EscrowSystem.load();
escrow.recipient = recipient;
escrow.amount = amount;

// owner is the account that sent this internal message (initializer)
escrow.owner = in.senderAddress;
escrow.recipient = payload.recipient;
escrow.amount = payload.amount;
escrow.isReleased = false;
escrow.isRequested = false;

escrow.store();
}

RequestFunds => {
val payload = msg as RequestFunds;
var escrow = lazy EscrowSystem.load();

// only the recipient may request funds
assert (in.senderAddress == escrow.recipient) throw 101;

// must not be already requested
assert (!escrow.isRequested) throw 102;

escrow.isRequested = true;
escrow.store();
}

ReleaseFunds => {
val escrow = lazy EscrowSystem.load();
assert (!escrow.isRequested) throw 108;
val payload = msg as ReleaseFunds;
var escrow = lazy EscrowSystem.load();

// must have been requested before releasing
assert (escrow.isRequested) throw 108;

// cannot release twice
assert (!escrow.isReleased) throw 109;

// only owner can release funds
assert (in.senderAddress == escrow.owner) throw 110;

escrow.isReleased = true;
escrow.store();

// send contract balance minus small reserve for gas (adjust if tests expect different)
val res = createMessage({
bounce: false,
dest: escrow.recipient,
value: contract.getOriginalBalance() - 100000000
value: contract.getOriginalBalance() - 100000000u
});
res.send(SEND_MODE_CARRY_ALL_BALANCE);
}
CancelEscrow=>{
val escrow = lazy EscrowSystem.load();

CancelEscrow => {
val payload = msg as CancelEscrow;
var escrow = lazy EscrowSystem.load();

// only owner may cancel
assert (in.senderAddress == escrow.owner) throw 106;

// cannot cancel after release
assert (!escrow.isReleased) throw 107;

escrow.isReleased = true;
escrow.store();

val res = createMessage({
bounce: false,
dest: in.senderAddress,
value: contract.getOriginalBalance() - 100000000
dest: in.senderAddress,
value: contract.getOriginalBalance() - 100000000u
});
res.send(SEND_MODE_CARRY_ALL_BALANCE);
}

else => {
assert (in.body.isEmpty()) throw 100;
}
}
}

get fun getEscrowDetails(): (address, address, uint64 , bool, bool) {
get fun getEscrowDetails(): (address, address, uint64, bool, bool) {
var escrow = lazy EscrowSystem.load();
return (escrow.owner, escrow.recipient, escrow.amount, escrow.isReleased, escrow.isRequested);
}
}

This must be the fix for the escrow contract according to me
Empty file added contracts/jest
Empty file.
106 changes: 73 additions & 33 deletions contracts/simple_dao.tolk
Original file line number Diff line number Diff line change
@@ -1,36 +1,76 @@
{/*
Create a Simple DAO contract that allows user to vote yes or no
The SimpleDao struct is the main storage of the contract.
It contains:
- queryId: uint32
- yesVotes: uint32
- noVotes: uint32
- totalVotes: uint32

The contract has 2 functionalities :
- Record a vote
- Reset the votes
The contract has a yesVotes that is used to identify the yes votes.
The contract has a noVotes that is used to identify the no votes.
The contract has a totalVotes that is used to identify the total votes.

There will be 2 structs :
- RecordVote : This struct is used to record a vote.
- ResetVotes : This struct is used to reset the votes.

The struct definitions are :
- RecordVote(queryId: uint32, vote: bool) : 0xF4A2B1C9
- ResetVotes(queryId: uint32) : 0xD4E7B328

There will be 1 getter function :
- getVotes : This function is used to get the votes. (yesVotes, noVotes, totalVotes)

Helpful Blueprint sdk commands:
- npx blueprint build - To build the contract
- npx blueprint test tests/SimpleDao.spec.ts - To test the contract
*/}

tolk 1.1
// contracts/simple_dao.tolk
// SimpleDAO contract - voting (yes/no) implementation

struct SimpleDao {
queryId: uint32;
yesVotes: uint32;
noVotes: uint32;
totalVotes: uint32;
}

static fun SimpleDao.load(): SimpleDao {
return SimpleDao.fromCell(contract.getData());
}

static fun SimpleDao.store(self: SimpleDao) {
contract.setData(self);
}

// Message structs (opcodes per spec)
struct (0xF4A2B1C9) RecordVote {
queryId: uint32;
vote: bool; // true => yes, false => no
}
struct (0xD4E7B328) ResetVotes {
queryId: uint32;
}

type MessageBody = RecordVote | ResetVotes;

fun onInternalMessage(in: InMessage) {
val msg = lazy MessageBody.fromSlice(in.body);

match (msg) {
RecordVote => {
val payload = msg as RecordVote;
var dao = lazy SimpleDao.load();

// increment appropriate counter
if (payload.vote) {
dao.yesVotes = dao.yesVotes + 1u;
} else {
dao.noVotes = dao.noVotes + 1u;
}
dao.totalVotes = dao.totalVotes + 1u;

dao.store();
}

ResetVotes => {
val payload = msg as ResetVotes;
var dao = lazy SimpleDao.load();

// Reset counts to zero
dao.yesVotes = 0u;
dao.noVotes = 0u;
dao.totalVotes = 0u;

// Optionally store queryId for traceability
dao.queryId = payload.queryId;

dao.store();
}

else => {
assert (in.body.isEmpty()) throw 100;
}
}
}

// Getter to return votes
get fun getVotes(): (uint32, uint32, uint32) {
var dao = lazy SimpleDao.load();
return (dao.yesVotes, dao.noVotes, dao.totalVotes);
}

Check if this works for simpleDao
66 changes: 37 additions & 29 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,31 +1,39 @@

{
"name": "SimpleDao",
"version": "0.0.1",
"scripts": {
"bp": "blueprint",
"start": "blueprint run",
"build": "blueprint build",
"test": "jest --verbose",
"release": "blueprint pack && npm publish --access public"
},
"dependencies": {
"@ton/core": "~0"
},
"devDependencies": {
"@ton/blueprint": ">=0.40.0",
"@ton/sandbox": ">=0.37.0",
"@ton/test-utils": ">=0.11.0",
"@types/jest": "^30.0.0",
"@types/node": "^22.17.2",
"jest": "^30.0.5",
"prettier": "^3.6.2",
"@ton/ton": ">=15.3.1 <16.0.0",
"@ton/crypto": "^3.3.0",
"ts-jest": "^29.4.1",
"ts-node": "^10.9.2",
"typescript": "^5.9.2",
"@ton/tolk-js": ">=1.0.0",
"@tact-lang/compiler": ">=1.6.13 <2.0.0",
"@ton-community/func-js": ">=0.10.0"
}
"name": "SimpleDao",
"version": "0.0.1",
"scripts": {
"bp": "blueprint",
"start": "blueprint run",
"build": "blueprint build",
"test": "jest --verbose",
"blueprint:test": "blueprint test",
"release": "blueprint pack && npm publish --access public"
},
"dependencies": {
"@ton/core": "~0"
},
"devDependencies": {
"@ton/blueprint": ">=0.40.0",
"@ton/sandbox": ">=0.37.0",
"@ton/test-utils": ">=0.11.0",
"@types/jest": "^30.0.0",
"@types/node": "^22.17.2",
"jest": "^30.0.5",
"prettier": "^3.6.2",
"@ton/ton": ">=15.3.1 <16.0.0",
"@ton/crypto": "^3.3.0",
"ts-jest": "^29.4.1",
"ts-node": "^10.9.2",
"typescript": "^5.9.2",
"@ton/tolk-js": ">=1.0.0",
"@tact-lang/compiler": ">=1.6.13 <2.0.0",
"@ton-community/func-js": ">=0.10.0"
},
"jest": {
"testPathIgnorePatterns": [
"<rootDir>/tests/"
]
}
}