Skip to content

Instantly share code, notes, and snippets.

@ngmachado
Created February 14, 2026 22:38
Show Gist options
  • Select an option

  • Save ngmachado/63e3fb7278b2f86325c1b918894ef26b to your computer and use it in GitHub Desktop.

Select an option

Save ngmachado/63e3fb7278b2f86325c1b918894ef26b to your computer and use it in GitHub Desktop.
// ERC20-style token that combines:
// 1) bitfields for compact configuration/account metadata,
// 2) comptime values,
// 3) generic helpers + generic struct instantiation.
bitfield TokenFlags : u256 {
initialized: bool;
paused: bool;
mint_enabled: bool;
burn_enabled: bool;
decimals: u8;
version: u8;
}
bitfield AccountFlags : u256 {
frozen: bool;
has_kyc: bool;
privileged: bool;
nonce: u16;
}
contract ERC20BitfieldComptimeGenerics {
struct TransferBook(comptime T: type) {
amount: T;
sender_before: T;
recipient_before: T;
}
storage var token_flags: TokenFlags;
storage var total_supply: u256;
storage balances: map<address, u256>;
storage allowances: map<address, map<address, u256>>;
storage account_flags: map<address, AccountFlags>;
log Transfer(from: address, to: address, amount: u256);
log Approval(owner: address, spender: address, amount: u256);
fn add(comptime T: type, a: T, b: T) -> T {
return a + b;
}
fn sub(comptime T: type, a: T, b: T) -> T {
return a - b;
}
fn ct(comptime T: type, comptime value: T) -> T {
return value;
}
pub fn init(initial_supply: u256) {
let deployer: NonZeroAddress = std.msg.sender();
total_supply = initial_supply;
balances[deployer] = initial_supply;
let f: TokenFlags = .{
.initialized = true,
.paused = false,
.mint_enabled = true,
.burn_enabled = true,
.decimals = ct(u8, 18),
.version = ct(u8, 1),
};
token_flags = f;
let a: AccountFlags = .{
.frozen = false,
.has_kyc = true,
.privileged = true,
.nonce = ct(u16, 1),
};
account_flags[deployer] = a;
log Transfer(std.constants.ZERO_ADDRESS, deployer, initial_supply);
}
pub fn decimals() -> u8 {
let f: TokenFlags = token_flags;
return f.decimals;
}
pub fn isPaused() -> bool {
let f: TokenFlags = token_flags;
return f.paused;
}
pub fn setPaused(next: bool) {
let f: TokenFlags = token_flags;
f.paused = next;
token_flags = f;
}
pub fn balanceOf(owner: address) -> u256 {
return balances[owner];
}
pub fn allowance(owner: address, spender: address) -> u256 {
return allowances[owner][spender];
}
pub fn approve(spender: NonZeroAddress, amount: u256) -> bool {
let owner: address = std.msg.sender();
allowances[owner][spender] = amount;
log Approval(owner, spender, amount);
return true;
}
pub fn transfer(to: NonZeroAddress, amount: MinValue<u256, 1>) -> bool {
let sender: NonZeroAddress = std.msg.sender();
let sender_before: u256 = balances[sender];
if (sender_before < amount) {
return false;
}
let recipient_before: u256 = balances[to];
let book = TransferBook(u256) {
amount: amount,
sender_before: sender_before,
recipient_before: recipient_before,
};
balances[sender] = sub(u256, book.sender_before, book.amount);
balances[to] = add(u256, book.recipient_before, book.amount);
let meta: AccountFlags = account_flags[sender];
meta.nonce = meta.nonce + 1;
account_flags[sender] = meta;
log Transfer(sender, to, amount);
return true;
}
pub fn transferFrom(from: NonZeroAddress, to: NonZeroAddress, amount: MinValue<u256, 1>) -> bool {
let spender: NonZeroAddress = std.msg.sender();
let current_allowance: u256 = allowances[from][spender];
if (current_allowance < amount) {
return false;
}
let sender_balance: u256 = balances[from];
if (sender_balance < amount) {
return false;
}
allowances[from][spender] = sub(u256, current_allowance, amount);
balances[from] = sub(u256, sender_balance, amount);
let recipient_balance: u256 = balances[to];
balances[to] = add(u256, recipient_balance, amount);
log Transfer(from, to, amount);
return true;
}
pub fn mint(to: NonZeroAddress, amount: MinValue<u256, 1>) -> bool {
let f: TokenFlags = token_flags;
if (f.mint_enabled == false) {
return false;
}
total_supply = add(u256, total_supply, amount);
let balance: u256 = balances[to];
balances[to] = add(u256, balance, amount);
log Transfer(std.constants.ZERO_ADDRESS, to, amount);
return true;
}
}
@ngmachado
Copy link
Author

the Z3 result:

⚠ Z3 counterexamples (8 guard(s) can be violated):
  guard:erc20_bitfield_comptime_generics.ora:108:21:2:non_zero_address:to in transfer:
    v_37555802528 = #x0000000000000000000000000000000000000000
  guard:erc20_bitfield_comptime_generics.ora:108:41:6:min_value:amount in transfer:
    v_37555802576 = #x0000000000000000000000000000000000000000000000000000000000000000
    v_37555802528 = #xffffffffffffffffffffffffffffffffffffffff
  guard:erc20_bitfield_comptime_generics.ora:157:17:2:non_zero_address:to in mint:
    v_37555803008 = #x0000000000000000000000000000000000000000
  guard:erc20_bitfield_comptime_generics.ora:157:37:6:min_value:amount in mint:
    v_37555803056 = #x0000000000000000000000000000000000000000000000000000000000000000
    v_37555803008 = #xffffffffffffffffffffffffffffffffffffffff
  guard:erc20_bitfield_comptime_generics.ora:134:25:4:non_zero_address:from in transferFrom:
    v_37555802816 = #x0000000000000000000000000000000000000000
  guard:erc20_bitfield_comptime_generics.ora:134:47:2:non_zero_address:to in transferFrom:
    v_37555802864 = #x0000000000000000000000000000000000000000
    v_37555802816 = #xffffffffffffffffffffffffffffffffffffffff
  guard:erc20_bitfield_comptime_generics.ora:134:67:6:min_value:amount in transferFrom:
    v_37555802912 = #x0000000000000000000000000000000000000000000000000000000000000000
    v_37555802864 = #xffffffffffffffffffffffffffffffffffffffff
    v_37555802816 = #xffffffffffffffffffffffffffffffffffffffff
  guard:erc20_bitfield_comptime_generics.ora:101:20:7:non_zero_address:spender in approve:
    v_37555802432 = #x0000000000000000000000000000000000000000

@ngmachado
Copy link
Author

gen bytecode

0x6137406020525b3861034052611c1761036052610360516103405110610380526103605161034051036103a05260206103c0526103c0516103a051106103e0526103e05161038051176104005261040051156104205261042051606157610291565b602051806103a0518036833701602052610440526103a0516103605161044051395f610460526104605161044051016104805261048051515f1c6104a0526104a05160405260b06135805260e9565b6102a06104c0526119776104e052602051806104e0518036833701602052610500526104e0516104c05161050051396104e05161050051f35b6040516080525f60a05261112d60c052600e60e0526004610100525f610120526002610140526001610160523361018052608051610160515560406101a052602051806101a05180368337016020526101c0526101c05180516101001b6101001c610180515f1b17905260206101e0526101e0516101c05101610200526102005180516101001b6101001c610140515f1b1790526101a0516101c0512061022052608051610220515560c0516101205155602051806101a0518036833701602052610240526102405180516101001b6101001c610180515f1b1790526101e0516102405101610260526102605180516101001b6101001c610100515f1b1790526101a05161024051206102805260e051610280515560606102a052602051806102a05180368337016020526102c052610120516102c051016102e0526102e05180516101001b6101001c60a0515f1b1790526101e0516102c05101610300526103005180516101001b6101001c610180515f1b1790526101a0516102c05101610320526103205180516101001b6101001c6080515f1b1790526102a0516102c051a061358051565b5f610520526105205161052051fd5b5f612e40526004612e60526020612e80526023612ea0526024612ec0526043612ee0526044612f00526063612f205260e0612f405238612f6052612e805180516101001b6101001c612f60515f1b17905234612f8052612f805115612fa052612fa051606a5760f5565b612e405135612fc052612fc051612f40511c612fe052612fe0515f525f5163313ce567146118cd575f5163b187bd2614611804575f516316c38b3c14611725575f516370a0823114611616575f5163dd62ed3e14611494575f5163095ea7b314611205575f5163a9059cbb14610bac575f516323b872dd14610565575f516340c10f191460ff5760f5565b612e4051612e4051fd5b366134c0526134c051612ee051106134e0526134e05161011d5760f5565b612e60513561350052612ec0513561352052613500516040526135205160605261014961370052610161565b60405161354052606051613560526135605161354051f35b6040516127a0526060516127c0525f6127e05260016128005260016128205261282051612800511661284052612820516127e051166128605260026128805260026128a0525f6128c0526127e0516127a051146128e052612820516128e0511861290052612900511561292052612920511561294052612940516101e457610563565b600161296052612800516127c0511161298052612800516127c051146129a0526129a05161298051176129c0526129c051156129e0526129e05115612a0052612a005161023057610561565b6128c05154612a2052612a2051612880511c612a405261280051612a405116612a60526001612a80526127e051612a605114612aa052612aa05115612ac052612ac05115612ae052612ae051610285576102dc565b6128605115612b0052612b005115612b20526020612b405260205180612b40518036833701602052612b6052612b605180516101001b6101001c612b20515f1b179052612b6051604052612b405160605261370051565b6128205154612b8052612b80516040526127c0516060526102ff6136a0526104b3565b604051612ba052606051612bc052612ba051515f1c612be052612be05161282051556040612c005260205180612c00518036833701602052612c2052612c205180516101001b6101001c6127a0515f1b1790526020612c4052612c4051612c205101612c6052612c605180516101001b6101001c6128a0515f1b179052612c0051612c205120612c8052612c805154612ca052612ca0516040526127c0516060526103ac6136a0526104b3565b604051612cc052606051612ce052612cc051515f1c612d0052612d0051612c8051556060612d205260205180612d20518036833701602052612d40525f612d6052612d6051612d405101612d8052612d805180516101001b6101001c6127e0515f1b179052612c4051612d405101612da052612da05180516101001b6101001c6127a0515f1b179052612c0051612d405101612dc052612dc05180516101001b6101001c6127c0515f1b179052612d2051612d4051a06128405115612de052612de05115612e005260205180612c40518036833701602052612e2052612e205180516101001b6101001c612e00515f1b179052612e2051604052612c405160605261370051565b604051611100526060516111205261112051611100510161114052600161116052611100516111405111611180526111005161114051146111a0526111a05161118051176111c0526111c051156111e0526111e05115611200526112005161051a5761055f565b60206112205260205180611220518036833701602052611240526112405180516101001b6101001c611140515f1b17905261124051604052611220516060526136a051565bfe5bfe5bfe5b366133e0526133e051612f20511061340052613400516105835760f5565b612e60513561342052612ec0513561344052612f005135613460526134205160405261344051606052613460516080526105bf6136e0526105d7565b604051613480526060516134a0526134a05161348051f35b604051611e0052606051611e2052608051611e40526001611e60526001611e8052611e8051611e605116611ea0525f611ec052611e8051611ec05116611ee0526002611f00526003611f2052611ec051611e005114611f4052611e8051611f405118611f6052611f605115611f8052611f805115611fa052611fa05161065c57610baa565b6001611fc052611ec051611e205114611fe052611fc051611fe05118612000526120005115612020526120205115612040526120405161069b57610ba8565b600161206052611e6051611e40511161208052611e6051611e4051146120a0526120a05161208051176120c0526120c051156120e0526120e0511561210052612100516106e757610ba6565b336121205260406121405260205180612140518036833701602052612160526121605180516101001b6101001c611e00515f1b1790526020612180526121805161216051016121a0526121a05180516101001b6101001c611f20515f1b1790526121405161216051206121c052602051806121405180368337016020526121e0526121e05180516101001b6101001c612120515f1b179052612180516121e05101612200526122005180516101001b6101001c6121c0515f1b179052612140516121e0512061222052612220515461224052600161226052611e405161224051106122805261228051156122a0526122a051156122c0526122c0516107eb57610842565b611ee051156122e0526122e051156123005260206123205260205180612320518036833701602052612340526123405180516101001b6101001c612300515f1b17905261234051604052612320516060526136e051565b60406123605260205180612360518036833701602052612380526123805180516101001b6101001c611e00515f1b17905260206123a0526123a05161238051016123c0526123c05180516101001b6101001c611f00515f1b1790526123605161238051206123e0526123e0515461240052600161242052611e4051612400511061244052612440511561246052612460511561248052612480516107eb576108e5565b61224051604052611e40516060526108ff61368052610af8565b6040516124a0526060516124c0526124a051515f1c6124e0526124e05161222051556121c0516121c0515561240051604052611e405160605261094461368052610af8565b604051612500526060516125205261250051515f1c61254052612540516123e0515560406125605260205180612560518036833701602052612580526125805180516101001b6101001c611e20515f1b17905260206125a0526125a05161258051016125c0526125c05180516101001b6101001c611f00515f1b1790526125605161258051206125e0526125e051546126005261260051604052611e40516060526109f16136a0526104b3565b604051612620526060516126405261262051515f1c61266052612660516125e05155606061268052602051806126805180368337016020526126a0525f6126c0526126c0516126a051016126e0526126e05180516101001b6101001c611e00515f1b1790526125a0516126a05101612700526127005180516101001b6101001c611e20515f1b179052612560516126a05101612720526127205180516101001b6101001c611e40515f1b179052612680516126a051a0611ea0511561274052612740511561276052602051806125a0518036833701602052612780526127805180516101001b6101001c612760515f1b179052612780516040526125a0516060526136e051565b604051610fa052606051610fc052610fc051610fa05103610fe052600161100052610fc051610fa0511161102052610fc051610fa05114611040526110405161102051176110605261106051156110805261108051156110a0526110a051610b5f57610ba4565b60206110c052602051806110c05180368337016020526110e0526110e05180516101001b6101001c610fe0515f1b1790526110e0516040526110c05160605261368051565bfe5bfe5bfe5bfe5b366133205261332051612ee051106133405261334051610bca5760f5565b612e60513561336052612ec05135613380526133605160405261338051606052610bf66136c052610c0e565b6040516133a0526060516133c0526133c0516133a051f35b60405161126052606051611280527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800076112a05261ffff6112c05260036112e052600161130052600161132052611320516113005116611340525f611360526113205161136051166113805260046113a05260026113c0526113605161126051146113e052611320516113e051186114005261140051156114205261142051156114405261144051610cbe57611203565b600161146052611300516112805111611480526113005161128051146114a0526114a05161148051176114c0526114c051156114e0526114e051156115005261150051610d0a57611201565b336115205260406115405260205180611540518036833701602052611560526115605180516101001b6101001c611520515f1b1790526020611580526115805161156051016115a0526115a05180516101001b6101001c6113c0515f1b1790526115405161156051206115c0526115c051546115e052600161160052611280516115e051106116205261162051156116405261164051156116605261166051610db257610e09565b61138051156116805261168051156116a05260206116c052602051806116c05180368337016020526116e0526116e05180516101001b6101001c6116a0515f1b1790526116e0516040526116c0516060526136c051565b60406117005260205180611700518036833701602052611720526117205180516101001b6101001c611260515f1b179052602061174052611740516117205101611760526117605180516101001b6101001c6113c0515f1b1790526117005161172051206117805261178051546117a05260606117c052602051806117c05180368337016020526117e0526117e05180516101001b6101001c611280515f1b179052611740516117e05101611800526118005180516101001b6101001c6115e0515f1b179052611700516117e05101611820526118205180516101001b6101001c6117a0515f1b179052611740516117e051016118405261184051515f1c611860526117e051515f1c611880526118605160405261188051606052610f3061368052610af8565b6040516118a0526060516118c0526118a051515f1c6118e0526118e0516115c05155611700516117e051016119005261190051515f1c611920526117e051515f1c611940526119205160405261194051606052610f8f6136a0526104b3565b604051611960526060516119805261196051515f1c6119a0526119a0516117805155602051806117005180368337016020526119c0526119c05180516101001b6101001c611520515f1b179052611740516119c051016119e0526119e05180516101001b6101001c6113a0515f1b179052611700516119c05120611a0052611a005154611a2052611a20516112e0511c611a40526112c051611a405116611a605261130051611a605101611a80526001611aa052611a6051611a805111611ac052611a6051611a805114611ae052611ae051611ac05117611b0052611b005115611b2052611b205115611b4052611b4051611089576111ff565b61ffff611b6052611b6051611a805116611b80526001611ba052611b8051611a805114611bc052611bc05115611be052611be05115611c0052611c00516110cf576111fd565b6112a051611a205116611c20526112c051611a805116611c4052611c40516112e0511b611c6052611c6051611c205117611c8052611c8051611a0051556060611ca05260205180611ca0518036833701602052611cc0525f611ce052611ce051611cc05101611d0052611d005180516101001b6101001c611520515f1b1790526020611d2052611d2051611cc05101611d4052611d405180516101001b6101001c611260515f1b1790526040611d6052611d6051611cc05101611d8052611d805180516101001b6101001c611280515f1b179052611ca051611cc051a06113405115611da052611da05115611dc05260205180611d20518036833701602052611de052611de05180516101001b6101001c611dc0515f1b179052611de051604052611d20516060526136c051565bfe5bfe5bfe5bfe5b366132605261326051612ee0511061328052613280516112235760f5565b612e6051356132a052612ec051356132c0526132a0516040526132c05160605261124f61366052611267565b6040516132e05260605161330052613300516132e051f35b604051610c0052606051610c20525f610c40526001610c60526001610c8052610c8051610c605116610ca0526003610cc052610c4051610c005114610ce052610c8051610ce05118610d0052610d005115610d2052610d205115610d4052610d40516112d257611492565b33610d60526040610d805260205180610d80518036833701602052610da052610da05180516101001b6101001c610d60515f1b1790526020610dc052610dc051610da05101610de052610de05180516101001b6101001c610cc0515f1b179052610d8051610da05120610e005260205180610d80518036833701602052610e2052610e205180516101001b6101001c610c00515f1b179052610dc051610e205101610e4052610e405180516101001b6101001c610e00515f1b179052610d8051610e205120610e6052610c2051610e605155610e0051610e0051556060610e805260205180610e80518036833701602052610ea0525f610ec052610ec051610ea05101610ee052610ee05180516101001b6101001c610d60515f1b179052610dc051610ea05101610f0052610f005180516101001b6101001c610c00515f1b179052610d8051610ea05101610f2052610f205180516101001b6101001c610c20515f1b179052610e8051610ea051a0610ca05115610f4052610f405115610f605260205180610dc0518036833701602052610f8052610f805180516101001b6101001c610f60515f1b179052610f8051604052610dc05160605261366051565bfe5b366131a0526131a051612ee051106131c0526131c0516114b25760f5565b612e6051356131e052612ec05135613200526131e051604052613200516060526114de613640526114f6565b60405161322052606051613240526132405161322051f35b604051610a6052606051610a80526003610aa0526040610ac05260205180610ac0518036833701602052610ae052610ae05180516101001b6101001c610a60515f1b1790526020610b0052610b0051610ae05101610b2052610b205180516101001b6101001c610aa0515f1b179052610ac051610ae05120610b405260205180610ac0518036833701602052610b6052610b605180516101001b6101001c610a80515f1b179052610b0051610b605101610b8052610b805180516101001b6101001c610b40515f1b179052610ac051610b605120610ba052610ba05154610bc05260205180610b00518036833701602052610be052610be05180516101001b6101001c610bc0515f1b179052610be051604052610b005160605261364051565b366131005261310051612ea0511061312052613120516116345760f5565b612e605135613140526131405160405261165061362052611668565b60405161316052606051613180526131805161316051f35b60405161094052600261096052604061098052602051806109805180368337016020526109a0526109a05180516101001b6101001c610940515f1b17905260206109c0526109c0516109a051016109e0526109e05180516101001b6101001c610960515f1b179052610980516109a05120610a0052610a005154610a2052602051806109c0518036833701602052610a4052610a405180516101001b6101001c610a20515f1b179052610a40516040526109c05160605261362051565b366130805261308051612ea051106130a0526130a0516117435760f5565b612e6051356130c0526130c05160405261175f6136005261176e565b5f6130e0526130e0516130e051f35b6040516107e0526001610800527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd61082052600161084052610840516107e05116610860525f6108805261088051546108a052610820516108a051166108c0526108005161086051166108e0526108e051610800511b61090052610900516108c051176109205261092051610880515561360051565b6118106135e052611828565b60405161304052606051613060526130605161304051f35b6001610660525f6106805261068051546106a0526106a051610660511c6106c052610660516106c051166106e052610660516106e05116610700526001610720526107205161070051166107405261074051156107605261076051156107805260206107a052602051806107a05180368337016020526107c0526107c05180516101001b6101001c610780515f1b1790526107c0516040526107a0516060526135e051565b6118d96135c0526118f1565b60405161300052606051613020526130205161300051f35b60046105405260ff610560525f6105805261058051546105a0526105a051610540511c6105c052610560516105c051166105e052610560516105e051166106005260206106205260205180610620518036833701602052610640526106405180516101001b6101001c610600515f1b17905261064051604052610620516060526135c05156

@ngmachado
Copy link
Author

Anvil tests

Bytecode saved to /tmp/ora_erc20_anvil/erc20_bitfield_comptime_generics.hex
bytecode chars: 14384
ctor arg chars: 66
deploy chars:   14448
Deploying contract...
Contract address: 0x5fbdb2315678afecb367f032d93f642f64180aa3
Running ERC20 checks...
✅ decimals() == 18
✅ isPaused() default false
✅ deployer balance after init
balances [after init]: alice=1000 bob=0 carol=0
✅ approve() call returns true
✅ allowance set to 200
balances [after approve]: alice=1000 bob=0 carol=0
✅ transfer() call returns true
✅ alice debited by transfer
✅ bob credited by transfer
balances [after transfer alice->bob (150)]: alice=850 bob=150 carol=0
✅ revert observed for: transfer(address,uint256) 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 0
✅ revert observed for: transfer(address,uint256) 0x0000000000000000000000000000000000000000 1
✅ isPaused() after setPaused(true)
✅ isPaused() after setPaused(false)
✅ transferFrom() call returns true
✅ alice debited by transferFrom
✅ carol credited by transferFrom
✅ allowance reduced to 80
balances [after transferFrom alice->carol (120)]: alice=730 bob=150 carol=120
✅ transferFrom() call returns false when allowance is low
✅ transferFrom(false) keeps sender balance unchanged
✅ transferFrom(false) keeps recipient balance unchanged
✅ transferFrom(false) keeps allowance unchanged
balances [after transferFrom(false) (state unchanged)]: alice=730 bob=150 carol=120
✅ mint() call returns true
✅ bob balance after mint
bob balance after mint [200]
balances [after mint to bob (50)]: alice=730 bob=200 carol=120
✅ post-mint transfer() call returns true
✅ alice debited by post-mint transfer
✅ bob credited by post-mint transfer
balances [after post-mint transfer alice->bob (10)]: alice=720 bob=210 carol=120
✅ revert observed for: mint(address,uint256) 0x0000000000000000000000000000000000000000 1
✅ revert observed for: mint(address,uint256) 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 0
✅ revert observed for: approve(address,uint256) 0x0000000000000000000000000000000000000000 1
✅ ERC20BitfieldComptimeGenerics Anvil checks passed

@ngmachado
Copy link
Author

SMT reported that is the companion for auditors

SMT Encoding Report

1. Run Metadata

  • Source file: ora-example/apps/erc20_bitfield_comptime_generics.ora
  • Generated at (unix): 1771155094
  • Verification mode: basic
  • verify_calls: true
  • verify_state: true
  • parallel: true
  • timeout_ms: 60000

2. Summary

  • Total queries: 27
  • SAT: 22
  • UNSAT: 5
  • UNKNOWN: 0
  • Failed obligations: 0
  • Inconsistent assumption bases: 0
  • Proven guards: 0
  • Violatable guards: 8
  • Verification success: true
  • Verification errors: 0
  • Verification diagnostics: 8

3. Query Kind Counts

  • base: 6
  • obligation: 5
  • loop_invariant_step: 0
  • loop_invariant_post: 0
  • guard_satisfy: 8
  • guard_violate: 8

4. Findings

Diagnostic 1

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:21:2:non_zero_address:to
  • Function: transfer
  • Counterexample:
    • v_40178867904 = #x0000000000000000000000000000000000000000

Diagnostic 2

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:41:6:min_value:amount
  • Function: transfer
  • Counterexample:
    • v_40178867952 = #x0000000000000000000000000000000000000000000000000000000000000000
    • v_40178867904 = #xffffffffffffffffffffffffffffffffffffffff

Diagnostic 3

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:17:2:non_zero_address:to
  • Function: mint
  • Counterexample:
    • v_40178868288 = #x0000000000000000000000000000000000000000

Diagnostic 4

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:37:6:min_value:amount
  • Function: mint
  • Counterexample:
    • v_40178868336 = #x0000000000000000000000000000000000000000000000000000000000000000
    • v_40178868288 = #xffffffffffffffffffffffffffffffffffffffff

Diagnostic 5

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:25:4:non_zero_address:from
  • Function: transferFrom
  • Counterexample:
    • v_40178868144 = #x0000000000000000000000000000000000000000

Diagnostic 6

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:47:2:non_zero_address:to
  • Function: transferFrom
  • Counterexample:
    • v_40178868144 = #xffffffffffffffffffffffffffffffffffffffff
    • v_40178868192 = #x0000000000000000000000000000000000000000

Diagnostic 7

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:67:6:min_value:amount
  • Function: transferFrom
  • Counterexample:
    • v_40178868144 = #xffffffffffffffffffffffffffffffffffffffff
    • v_40178868240 = #x0000000000000000000000000000000000000000000000000000000000000000
    • v_40178868192 = #xffffffffffffffffffffffffffffffffffffffff

Diagnostic 8

  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:101:20:7:non_zero_address:spender
  • Function: approve
  • Counterexample:
    • v_40178867712 = #x0000000000000000000000000000000000000000

5. Query Catalog

Q1 - base

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":108:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))

Q2 - obligation

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":127:0
  • Status: UNSAT
  • Elapsed ms: 0
  • Obligation kind: contract invariant
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))
(assert (not (bvult #x0000000000000000000000000000000000000000000000000000000000000003
            #x0000000000000000000000000000000000000000000000000000000000000100)))

Q3 - guard_satisfy

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":108:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:21:2:non_zero_address:to
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(declare-fun v_40178867904 () (_ BitVec 160))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))
(assert (not (= ((_ extract 159 0) v_40178867904)
        #x0000000000000000000000000000000000000000)))

Q4 - guard_violate

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":108:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:21:2:non_zero_address:to
  • Model:
v_40178867904 -> #x0000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(declare-fun v_40178867904 () (_ BitVec 160))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))
(assert (not (not (= ((_ extract 159 0) v_40178867904)
             #x0000000000000000000000000000000000000000))))

Q5 - guard_satisfy

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":108:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:41:6:min_value:amount
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(declare-fun v_40178867904 () (_ BitVec 160))
(declare-fun v_40178867952 () (_ BitVec 256))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))
(assert (not (= ((_ extract 159 0) v_40178867904)
        #x0000000000000000000000000000000000000000)))
(assert (bvuge v_40178867952
       #x0000000000000000000000000000000000000000000000000000000000000001))

Q6 - guard_violate

  • Function: transfer
  • Location: loc("erc20_bitfield_comptime_generics.ora":108:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:108:41:6:min_value:amount
  • Model:
v_40178867904 -> #xffffffffffffffffffffffffffffffffffffffff
v_40178867952 -> #x0000000000000000000000000000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun env_evm_caller () (_ BitVec 160))
(declare-fun g_account_flags () (Array (_ BitVec 160) (_ BitVec 256)))
(declare-fun v_40178867904 () (_ BitVec 160))
(declare-fun v_40178867952 () (_ BitVec 256))
(assert (bvule (bvand (bvlshr (select g_account_flags env_evm_caller)
                      #x0000000000000000000000000000000000000000000000000000000000000003)
              #x000000000000000000000000000000000000000000000000000000000000ffff)
       #x000000000000000000000000000000000000000000000000000000000000ffff))
(assert (not (= ((_ extract 159 0) v_40178867904)
        #x0000000000000000000000000000000000000000)))
(assert (not (bvuge v_40178867952
            #x0000000000000000000000000000000000000000000000000000000000000001)))

Q7 - base

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":157:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))

Q8 - obligation

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":159:0
  • Status: UNSAT
  • Elapsed ms: 0
  • Obligation kind: contract invariant
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (bvult #x0000000000000000000000000000000000000000000000000000000000000002
            #x0000000000000000000000000000000000000000000000000000000000000100)))

Q9 - obligation

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":159:0
  • Status: UNSAT
  • Elapsed ms: 0
  • Obligation kind: contract invariant
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (bvult #x0000000000000000000000000000000000000000000000000000000000000002
            #x0000000000000000000000000000000000000000000000000000000000000100)))

Q10 - guard_satisfy

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":157:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:17:2:non_zero_address:to
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(declare-fun v_40178868288 () (_ BitVec 160))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (= ((_ extract 159 0) v_40178868288)
        #x0000000000000000000000000000000000000000)))

Q11 - guard_violate

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":157:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:17:2:non_zero_address:to
  • Model:
v_40178868288 -> #x0000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(declare-fun v_40178868288 () (_ BitVec 160))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (not (= ((_ extract 159 0) v_40178868288)
             #x0000000000000000000000000000000000000000))))

Q12 - guard_satisfy

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":157:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:37:6:min_value:amount
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(declare-fun v_40178868288 () (_ BitVec 160))
(declare-fun v_40178868336 () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (= ((_ extract 159 0) v_40178868288)
        #x0000000000000000000000000000000000000000)))
(assert (bvuge v_40178868336
       #x0000000000000000000000000000000000000000000000000000000000000001))

Q13 - guard_violate

  • Function: mint
  • Location: loc("erc20_bitfield_comptime_generics.ora":157:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:157:37:6:min_value:amount
  • Model:
v_40178868288 -> #xffffffffffffffffffffffffffffffffffffffff
v_40178868336 -> #x0000000000000000000000000000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(declare-fun v_40178868288 () (_ BitVec 160))
(declare-fun v_40178868336 () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000002)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (= ((_ extract 159 0) v_40178868288)
        #x0000000000000000000000000000000000000000)))
(assert (not (bvuge v_40178868336
            #x0000000000000000000000000000000000000000000000000000000000000001)))

Q14 - base

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:

Q15 - guard_satisfy

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:25:4:non_zero_address:from
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(assert (not (= ((_ extract 159 0) v_40178868144)
        #x0000000000000000000000000000000000000000)))

Q16 - guard_violate

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:25:4:non_zero_address:from
  • Model:
v_40178868144 -> #x0000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(assert (not (not (= ((_ extract 159 0) v_40178868144)
             #x0000000000000000000000000000000000000000))))

Q17 - guard_satisfy

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:47:2:non_zero_address:to
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(declare-fun v_40178868192 () (_ BitVec 160))
(assert (not (= ((_ extract 159 0) v_40178868144)
        #x0000000000000000000000000000000000000000)))
(assert (not (= ((_ extract 159 0) v_40178868192)
        #x0000000000000000000000000000000000000000)))

Q18 - guard_violate

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:47:2:non_zero_address:to
  • Model:
v_40178868144 -> #xffffffffffffffffffffffffffffffffffffffff
v_40178868192 -> #x0000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(declare-fun v_40178868192 () (_ BitVec 160))
(assert (not (= ((_ extract 159 0) v_40178868144)
        #x0000000000000000000000000000000000000000)))
(assert (not (not (= ((_ extract 159 0) v_40178868192)
             #x0000000000000000000000000000000000000000))))

Q19 - guard_satisfy

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:67:6:min_value:amount
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(declare-fun v_40178868192 () (_ BitVec 160))
(declare-fun v_40178868240 () (_ BitVec 256))
(assert (not (= ((_ extract 159 0) v_40178868144)
        #x0000000000000000000000000000000000000000)))
(assert (not (= ((_ extract 159 0) v_40178868192)
        #x0000000000000000000000000000000000000000)))
(assert (bvuge v_40178868240
       #x0000000000000000000000000000000000000000000000000000000000000001))

Q20 - guard_violate

  • Function: transferFrom
  • Location: loc("erc20_bitfield_comptime_generics.ora":134:0
  • Status: SAT
  • Elapsed ms: 1
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:134:67:6:min_value:amount
  • Model:
v_40178868144 -> #xffffffffffffffffffffffffffffffffffffffff
v_40178868192 -> #xffffffffffffffffffffffffffffffffffffffff
v_40178868240 -> #x0000000000000000000000000000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun v_40178868144 () (_ BitVec 160))
(declare-fun v_40178868192 () (_ BitVec 160))
(declare-fun v_40178868240 () (_ BitVec 256))
(assert (not (= ((_ extract 159 0) v_40178868144)
        #x0000000000000000000000000000000000000000)))
(assert (not (= ((_ extract 159 0) v_40178868192)
        #x0000000000000000000000000000000000000000)))
(assert (not (bvuge v_40178868240
            #x0000000000000000000000000000000000000000000000000000000000000001)))

Q21 - base

  • Function: approve
  • Location: loc("erc20_bitfield_comptime_generics.ora":101:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:

Q22 - guard_satisfy

  • Function: approve
  • Location: loc("erc20_bitfield_comptime_generics.ora":101:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:101:20:7:non_zero_address:spender
  • SMT-LIB:
(declare-fun v_40178867712 () (_ BitVec 160))
(assert (not (= ((_ extract 159 0) v_40178867712)
        #x0000000000000000000000000000000000000000)))

Q23 - guard_violate

  • Function: approve
  • Location: loc("erc20_bitfield_comptime_generics.ora":101:0
  • Status: SAT
  • Elapsed ms: 0
  • Guard ID: guard:erc20_bitfield_comptime_generics.ora:101:20:7:non_zero_address:spender
  • Model:
v_40178867712 -> #x0000000000000000000000000000000000000000
  • SMT-LIB:
(declare-fun v_40178867712 () (_ BitVec 160))
(assert (not (not (= ((_ extract 159 0) v_40178867712)
             #x0000000000000000000000000000000000000000))))

Q24 - base

  • Function: isPaused
  • Location: loc("erc20_bitfield_comptime_generics.ora":84:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000001)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))

Q25 - obligation

  • Function: isPaused
  • Location: loc("erc20_bitfield_comptime_generics.ora":84:0
  • Status: UNSAT
  • Elapsed ms: 0
  • Obligation kind: contract invariant
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000001)
              #x0000000000000000000000000000000000000000000000000000000000000001)
       #x0000000000000000000000000000000000000000000000000000000000000001))
(assert (not (bvult #x0000000000000000000000000000000000000000000000000000000000000001
            #x0000000000000000000000000000000000000000000000000000000000000100)))

Q26 - base

  • Function: decimals
  • Location: loc("erc20_bitfield_comptime_generics.ora":79:0
  • Status: SAT
  • Elapsed ms: 0
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000004)
              #x00000000000000000000000000000000000000000000000000000000000000ff)
       #x00000000000000000000000000000000000000000000000000000000000000ff))

Q27 - obligation

  • Function: decimals
  • Location: loc("erc20_bitfield_comptime_generics.ora":79:0
  • Status: UNSAT
  • Elapsed ms: 0
  • Obligation kind: contract invariant
  • SMT-LIB:
(declare-fun g_token_flags () (_ BitVec 256))
(assert (bvule (bvand (bvlshr g_token_flags
                      #x0000000000000000000000000000000000000000000000000000000000000004)
              #x00000000000000000000000000000000000000000000000000000000000000ff)
       #x00000000000000000000000000000000000000000000000000000000000000ff))
(assert (not (bvult #x0000000000000000000000000000000000000000000000000000000000000004
            #x0000000000000000000000000000000000000000000000000000000000000100)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment