Skip to content

Instantly share code, notes, and snippets.

View mariano-aguero's full-sized avatar
:octocat:
Focusing

Mariano Aguero mariano-aguero

:octocat:
Focusing
View GitHub Profile
const Big = require('big.js')
const BN = require('bn.js')
const MathBN = {
sub: (a, b) => {
const aBN = new Big(a || '0')
const bBN = new Big(b || '0')
return aBN.sub(bBN).toString(10)
},
add: (a, b) => {
@mariano-aguero
mariano-aguero / asset.ligo
Created February 27, 2020 19:48
Implementation of the FA1.2 specification, AKA ERC20
// This is an implementation of the FA1.2 specification in PascaLIGO
type amount is nat;
type account is record
balance : amount;
allowances: map(address, amount);
end
type action is
(address :from, (address :to, nat :value)) %transfer
view (address :owner) nat %getBalance
view unit nat %getTotalSupply
@mariano-aguero
mariano-aguero / conversions.ligo
Last active April 14, 2020 16:52
Liquidity pool for tezos
function natToTz(const val: nat): tez is val * 1tz
function natToMutez(const val: nat): tez is val * 1mutez
function tezToNatWithMutez(const val: tez): nat is val / 1mutez
function tezToNatWithTz(const val: tez): nat is val / 1tz
function natToInt(const val: nat): int is val + 0
@mariano-aguero
mariano-aguero / fa12.ligo
Created April 20, 2020 17:04
FA 1.2 entry points
function main (const action : tokenAction ; const store : store) : return is
block {
if amount =/= 0tz then failwith ("This contract do not accept token amount");
else skip;
} with case action of
GetAllowance(n) -> allowance(n.0, n.1, n.2, store)
| Transfer(n) -> transfer(n.0, n.1, n.2, store)
| Approve(n) -> approve(n.0, n.1, store)
| GetBalance(n) -> balanceOf(n.0, n.1, store)
| GetTotalSupply(n) -> totalSupply(n.1, store)
@mariano-aguero
mariano-aguero / fa12.ligo
Created April 20, 2020 17:24
FA12 token actions
type tokenAction is
| GetAllowance of (address * address * contract(nat))
| Transfer of (address * address * nat)
| Approve of (address * nat)
| GetBalance of (address * contract(nat))
| GetTotalSupply of (unit * contract(nat))
| Mint of (nat)
| Burn of (nat)
| Symbol of (unit * contract(string))
| Name of (unit * contract(string))
@mariano-aguero
mariano-aguero / FA12.ligo
Created April 20, 2020 17:45
FA12 store
type account is record
balance: nat;
allowances: map(address, nat);
end
type store is record
owners: set(address);
decimals: nat; // Added this property used in the erc20 ethereum specification
symbol: string; // Added this property used in the erc20 ethereum specification
name: string; // Added this property used in the erc20 ethereum specification
function mint (const value : nat ; var store : store) : return is
block {
// Fail if is not an owner
if not isOwner(sender, store) then failwith("You must be an owner of the contract to mint tokens");
else block {
var ownerAccount: account := record
balance = 0n;
allowances = (map end : map(address, nat));
end;
case store.accounts[sender] of
function approve (const addressSpender : address; const value : nat; var store : store) : return is
block {
// If sender is the spender approving is not necessary
if sender = addressSpender then skip;
else block {
const senderAccount: account = getAccount(sender, store.accounts);
var allowed: nat := getAllowance(addressSpender, senderAccount.allowances);
// Changing allowance value from non-zero value to a non-zero value is forbidden to prevent the corresponding attack vector.
if allowed =/= 0n then failwith("UnsafeAllowanceChange");
@mariano-aguero
mariano-aguero / fa12.ligo
Last active April 20, 2020 18:58
fa12.ligo
function transfer (const addressFrom : address; const addressTo : address; const value : nat; var store : store) : return is
block {
if addressFrom = addressTo then skip;
else block {
case isAllowed(addressFrom, addressTo, value, store) of
| False -> block {
failwith ("NotEnoughAllowance");
}
| True -> skip
end;