add cameligo contract
This commit is contained in:
parent
82b3d634c1
commit
716751553e
109
src/test/contracts/FA1.2.mligo
Normal file
109
src/test/contracts/FA1.2.mligo
Normal file
@ -0,0 +1,109 @@
|
||||
type tokens = (address, nat) big_map
|
||||
type allowances = (address * address, nat) big_map (* (sender,account) -> value *)
|
||||
|
||||
type storage = {
|
||||
tokens : tokens;
|
||||
allowances : allowances;
|
||||
total_amount : nat;
|
||||
}
|
||||
|
||||
type transfer = {
|
||||
address_from : address;
|
||||
address_to : address;
|
||||
value : nat;
|
||||
}
|
||||
|
||||
type approve = {
|
||||
spender : address;
|
||||
value : nat;
|
||||
}
|
||||
|
||||
type getAllowance = {
|
||||
owner : address;
|
||||
spender : address;
|
||||
callback : nat contract;
|
||||
}
|
||||
|
||||
type getBalance = {
|
||||
owner : address;
|
||||
callback : nat contract;
|
||||
}
|
||||
|
||||
type getTotalSupply = {
|
||||
callback : nat contract;
|
||||
}
|
||||
|
||||
type action =
|
||||
Transfer of transfer
|
||||
| Approve of approve
|
||||
| GetAllowance of getAllowance
|
||||
| GetBalance of getBalance
|
||||
| GetTotalSupply of getTotalSupply
|
||||
|
||||
let transfer (p,s : transfer * storage) : operation list * storage =
|
||||
let new_allowances =
|
||||
if Tezos.sender = p.address_from then s.allowances
|
||||
else
|
||||
let authorized_value = match Big_map.find_opt (Tezos.sender,p.address_from) s.allowances with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
if (authorized_value < p.value)
|
||||
then (failwith "Not Enough Allowance" : allowances)
|
||||
else Big_map.update (Tezos.sender,p.address_from) (Some (abs(authorized_value - p.value))) s.allowances
|
||||
in
|
||||
let sender_balance = match Big_map.find_opt p.address_from s.tokens with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
if (sender_balance < p.value)
|
||||
then (failwith "Not Enough Balance" : operation list * storage)
|
||||
else
|
||||
let new_tokens = Big_map.update p.address_from (Some (abs(sender_balance - p.value))) s.tokens in
|
||||
let receiver_balance = match Big_map.find_opt p.address_to s.tokens with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
let new_tokens = Big_map.update p.address_to (Some (receiver_balance + p.value)) new_tokens in
|
||||
([]:operation list), {s with tokens = new_tokens; allowances = new_allowances}
|
||||
|
||||
let approve (p,s : approve * storage) : operation list * storage =
|
||||
let previous_value = match Big_map.find_opt (p.spender, Tezos.sender) s.allowances with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
if previous_value > 0n && p.value > 0n
|
||||
then (failwith "Unsafe Allowance Change" : operation list * storage)
|
||||
else
|
||||
let new_allowances = Big_map.update (p.spender, Tezos.sender) (Some (p.value)) s.allowances in
|
||||
([] : operation list), {s with allowances = new_allowances}
|
||||
|
||||
let getAllowance (p,s : getAllowance * storage) : operation list * storage =
|
||||
let value = match Big_map.find_opt (p.owner, p.spender) s.allowances with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
let op = Tezos.transaction value 0mutez p.callback in
|
||||
([op],s)
|
||||
|
||||
let getBalance (p,s : getBalance * storage) : operation list * storage =
|
||||
let value = match Big_map.find_opt p.owner s.tokens with
|
||||
Some value -> value
|
||||
| None -> 0n
|
||||
in
|
||||
let op = Tezos.transaction value 0mutez p.callback in
|
||||
([op],s)
|
||||
|
||||
let getTotalSupply (p,s : getTotalSupply * storage) : operation list * storage =
|
||||
let total = s.total_amount in
|
||||
let op = Tezos.transaction total 0mutez p.callback in
|
||||
([op],s)
|
||||
|
||||
|
||||
let main (a,s:action * storage) =
|
||||
match a with
|
||||
Transfer p -> transfer (p,s)
|
||||
| Approve p -> approve (p,s)
|
||||
| GetAllowance p -> getAllowance (p,s)
|
||||
| GetBalance p -> getBalance (p,s)
|
||||
| GetTotalSupply p -> getTotalSupply (p,s)
|
Loading…
Reference in New Issue
Block a user