Skip to content
Open
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
92 changes: 30 additions & 62 deletions 3.restricted-mint-multisig/imports/multisig.leo
Original file line number Diff line number Diff line change
@@ -1,78 +1,46 @@
program multisig.aleo {
const ADD_SIGNER_FN: field = 1field;
const CHANGE_REQUIRED_SIGNATURES_FN: field = 2field;
import multisig.leo;

mapping required_signatures: bool => u64;
mapping proposals: Proposal => u64;
mapping signers: address => bool;
program token.aleo {
const MINT_FN: field = 1field;

struct Proposal {
program_address: address,
function_id: field,
args_hash: field,
}

record ticket {
record token {
owner: address,
program_address: address,
function_id: field,
args_hash: field,
}

transition mint_ticket(proposal: Proposal) -> ticket {
return ticket {
owner: self.caller,
program_address: proposal.program_address,
function_id: proposal.function_id,
args_hash: proposal.args_hash,
} then finalize(proposal);
}

finalize mint_ticket(proposal: Proposal) {
let signatures: u64 = Mapping::get_or_use(proposals, proposal, 0u64);
let min_signatures: u64 = Mapping::get_or_use(required_signatures, true, 0u64);
assert(signatures >= min_signatures);
Mapping::set(proposals, proposal, 0u64);
}

transition sign(proposal: Proposal) {
return then finalize(self.caller, proposal);
amount: u64,
}

finalize sign(caller: address, proposal: Proposal) {
assert(Mapping::get(signers, caller));
let signatures: u64 = Mapping::get_or_use(proposals, proposal, 0u64);
Mapping::set(proposals, proposal, signatures + 1u64);
struct MintArgs {
receiver: address,
amount: u64,
}

transition add_signer(ticket_: ticket, new_signer: address) {
transition mint(ticket_: multisig.leo/ticket.record, args: MintArgs) -> token {
assert_eq(
ticket_.program_address,
aleo10frku8hz8zyyh03avmr2gjg6zyqz98g2fmcew96a50vxeke995qsuf90f2 // address("multisig.aleo")
aleo16l909ch9c9zujjlthk47knk72zq0r4wd7eveqm8ukgta6cfszsgs4nd7p4 // address("token.aleo")
);
assert_eq(ticket_.function_id, ADD_SIGNER_FN);
assert_eq(ticket_.args_hash, BHP256::hash_to_field(new_signer));
return then finalize(new_signer);
}
assert_eq(ticket_.function_id, MINT_FN);
assert_eq(ticket_.args_hash, BHP256::hash_to_field(args));
multisig.leo/burn(ticket_);

finalize add_signer(new_signer: address) {
Mapping::set(signers, new_signer, true);
return token {
owner: args.receiver,
amount: args.amount,
};
}

transition change_required_signatures(ticket_: ticket, new_required_signatures: u64) {
assert_eq(
ticket_.program_address,
aleo10frku8hz8zyyh03avmr2gjg6zyqz98g2fmcew96a50vxeke995qsuf90f2 // address("multisig.aleo")
);
assert_eq(ticket_.function_id, CHANGE_REQUIRED_SIGNATURES_FN);
assert_eq(ticket_.args_hash, BHP256::hash_to_field(new_required_signatures));
transition transfer(sender: token, receiver: address, amount: u64) -> (token, token) {
let difference: u64 = sender.amount - amount;

return then finalize(new_required_signatures);
}
let remaining: token = token {
owner: sender.owner,
amount: difference,
};

finalize change_required_signatures(new_required_signatures: u64) {
Mapping::set(required_signatures, true, new_required_signatures);
}
let transferred: token = token {
owner: receiver,
amount: amount,
};

transition burn(ticket_: ticket) {}
}
return (remaining, transferred);
}
}