Created
February 14, 2026 22:38
-
-
Save ngmachado/63e3fb7278b2f86325c1b918894ef26b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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; | |
| } | |
| } |
Author
Author
gen bytecode
0x6137406020525b3861034052611c1761036052610360516103405110610380526103605161034051036103a05260206103c0526103c0516103a051106103e0526103e05161038051176104005261040051156104205261042051606157610291565b602051806103a0518036833701602052610440526103a0516103605161044051395f610460526104605161044051016104805261048051515f1c6104a0526104a05160405260b06135805260e9565b6102a06104c0526119776104e052602051806104e0518036833701602052610500526104e0516104c05161050051396104e05161050051f35b6040516080525f60a05261112d60c052600e60e0526004610100525f610120526002610140526001610160523361018052608051610160515560406101a052602051806101a05180368337016020526101c0526101c05180516101001b6101001c610180515f1b17905260206101e0526101e0516101c05101610200526102005180516101001b6101001c610140515f1b1790526101a0516101c0512061022052608051610220515560c0516101205155602051806101a0518036833701602052610240526102405180516101001b6101001c610180515f1b1790526101e0516102405101610260526102605180516101001b6101001c610100515f1b1790526101a05161024051206102805260e051610280515560606102a052602051806102a05180368337016020526102c052610120516102c051016102e0526102e05180516101001b6101001c60a0515f1b1790526101e0516102c05101610300526103005180516101001b6101001c610180515f1b1790526101a0516102c05101610320526103205180516101001b6101001c6080515f1b1790526102a0516102c051a061358051565b5f610520526105205161052051fd5b5f612e40526004612e60526020612e80526023612ea0526024612ec0526043612ee0526044612f00526063612f205260e0612f405238612f6052612e805180516101001b6101001c612f60515f1b17905234612f8052612f805115612fa052612fa051606a5760f5565b612e405135612fc052612fc051612f40511c612fe052612fe0515f525f5163313ce567146118cd575f5163b187bd2614611804575f516316c38b3c14611725575f516370a0823114611616575f5163dd62ed3e14611494575f5163095ea7b314611205575f5163a9059cbb14610bac575f516323b872dd14610565575f516340c10f191460ff5760f5565b612e4051612e4051fd5b366134c0526134c051612ee051106134e0526134e05161011d5760f5565b612e60513561350052612ec0513561352052613500516040526135205160605261014961370052610161565b60405161354052606051613560526135605161354051f35b6040516127a0526060516127c0525f6127e05260016128005260016128205261282051612800511661284052612820516127e051166128605260026128805260026128a0525f6128c0526127e0516127a051146128e052612820516128e0511861290052612900511561292052612920511561294052612940516101e457610563565b600161296052612800516127c0511161298052612800516127c051146129a0526129a05161298051176129c0526129c051156129e0526129e05115612a0052612a005161023057610561565b6128c05154612a2052612a2051612880511c612a405261280051612a405116612a60526001612a80526127e051612a605114612aa052612aa05115612ac052612ac05115612ae052612ae051610285576102dc565b6128605115612b0052612b005115612b20526020612b405260205180612b40518036833701602052612b6052612b605180516101001b6101001c612b20515f1b179052612b6051604052612b405160605261370051565b6128205154612b8052612b80516040526127c0516060526102ff6136a0526104b3565b604051612ba052606051612bc052612ba051515f1c612be052612be05161282051556040612c005260205180612c00518036833701602052612c2052612c205180516101001b6101001c6127a0515f1b1790526020612c4052612c4051612c205101612c6052612c605180516101001b6101001c6128a0515f1b179052612c0051612c205120612c8052612c805154612ca052612ca0516040526127c0516060526103ac6136a0526104b3565b604051612cc052606051612ce052612cc051515f1c612d0052612d0051612c8051556060612d205260205180612d20518036833701602052612d40525f612d6052612d6051612d405101612d8052612d805180516101001b6101001c6127e0515f1b179052612c4051612d405101612da052612da05180516101001b6101001c6127a0515f1b179052612c0051612d405101612dc052612dc05180516101001b6101001c6127c0515f1b179052612d2051612d4051a06128405115612de052612de05115612e005260205180612c40518036833701602052612e2052612e205180516101001b6101001c612e00515f1b179052612e2051604052612c405160605261370051565b604051611100526060516111205261112051611100510161114052600161116052611100516111405111611180526111005161114051146111a0526111a05161118051176111c0526111c051156111e0526111e05115611200526112005161051a5761055f565b60206112205260205180611220518036833701602052611240526112405180516101001b6101001c611140515f1b17905261124051604052611220516060526136a051565bfe5bfe5bfe5b366133e0526133e051612f20511061340052613400516105835760f5565b612e60513561342052612ec0513561344052612f005135613460526134205160405261344051606052613460516080526105bf6136e0526105d7565b604051613480526060516134a0526134a05161348051f35b604051611e0052606051611e2052608051611e40526001611e60526001611e8052611e8051611e605116611ea0525f611ec052611e8051611ec05116611ee0526002611f00526003611f2052611ec051611e005114611f4052611e8051611f405118611f6052611f605115611f8052611f805115611fa052611fa05161065c57610baa565b6001611fc052611ec051611e205114611fe052611fc051611fe05118612000526120005115612020526120205115612040526120405161069b57610ba8565b600161206052611e6051611e40511161208052611e6051611e4051146120a0526120a05161208051176120c0526120c051156120e0526120e0511561210052612100516106e757610ba6565b336121205260406121405260205180612140518036833701602052612160526121605180516101001b6101001c611e00515f1b1790526020612180526121805161216051016121a0526121a05180516101001b6101001c611f20515f1b1790526121405161216051206121c052602051806121405180368337016020526121e0526121e05180516101001b6101001c612120515f1b179052612180516121e05101612200526122005180516101001b6101001c6121c0515f1b179052612140516121e0512061222052612220515461224052600161226052611e405161224051106122805261228051156122a0526122a051156122c0526122c0516107eb57610842565b611ee051156122e0526122e051156123005260206123205260205180612320518036833701602052612340526123405180516101001b6101001c612300515f1b17905261234051604052612320516060526136e051565b60406123605260205180612360518036833701602052612380526123805180516101001b6101001c611e00515f1b17905260206123a0526123a05161238051016123c0526123c05180516101001b6101001c611f00515f1b1790526123605161238051206123e0526123e0515461240052600161242052611e4051612400511061244052612440511561246052612460511561248052612480516107eb576108e5565b61224051604052611e40516060526108ff61368052610af8565b6040516124a0526060516124c0526124a051515f1c6124e0526124e05161222051556121c0516121c0515561240051604052611e405160605261094461368052610af8565b604051612500526060516125205261250051515f1c61254052612540516123e0515560406125605260205180612560518036833701602052612580526125805180516101001b6101001c611e20515f1b17905260206125a0526125a05161258051016125c0526125c05180516101001b6101001c611f00515f1b1790526125605161258051206125e0526125e051546126005261260051604052611e40516060526109f16136a0526104b3565b604051612620526060516126405261262051515f1c61266052612660516125e05155606061268052602051806126805180368337016020526126a0525f6126c0526126c0516126a051016126e0526126e05180516101001b6101001c611e00515f1b1790526125a0516126a05101612700526127005180516101001b6101001c611e20515f1b179052612560516126a05101612720526127205180516101001b6101001c611e40515f1b179052612680516126a051a0611ea0511561274052612740511561276052602051806125a0518036833701602052612780526127805180516101001b6101001c612760515f1b179052612780516040526125a0516060526136e051565b604051610fa052606051610fc052610fc051610fa05103610fe052600161100052610fc051610fa0511161102052610fc051610fa05114611040526110405161102051176110605261106051156110805261108051156110a0526110a051610b5f57610ba4565b60206110c052602051806110c05180368337016020526110e0526110e05180516101001b6101001c610fe0515f1b1790526110e0516040526110c05160605261368051565bfe5bfe5bfe5bfe5b366133205261332051612ee051106133405261334051610bca5760f5565b612e60513561336052612ec05135613380526133605160405261338051606052610bf66136c052610c0e565b6040516133a0526060516133c0526133c0516133a051f35b60405161126052606051611280527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800076112a05261ffff6112c05260036112e052600161130052600161132052611320516113005116611340525f611360526113205161136051166113805260046113a05260026113c0526113605161126051146113e052611320516113e051186114005261140051156114205261142051156114405261144051610cbe57611203565b600161146052611300516112805111611480526113005161128051146114a0526114a05161148051176114c0526114c051156114e0526114e051156115005261150051610d0a57611201565b336115205260406115405260205180611540518036833701602052611560526115605180516101001b6101001c611520515f1b1790526020611580526115805161156051016115a0526115a05180516101001b6101001c6113c0515f1b1790526115405161156051206115c0526115c051546115e052600161160052611280516115e051106116205261162051156116405261164051156116605261166051610db257610e09565b61138051156116805261168051156116a05260206116c052602051806116c05180368337016020526116e0526116e05180516101001b6101001c6116a0515f1b1790526116e0516040526116c0516060526136c051565b60406117005260205180611700518036833701602052611720526117205180516101001b6101001c611260515f1b179052602061174052611740516117205101611760526117605180516101001b6101001c6113c0515f1b1790526117005161172051206117805261178051546117a05260606117c052602051806117c05180368337016020526117e0526117e05180516101001b6101001c611280515f1b179052611740516117e05101611800526118005180516101001b6101001c6115e0515f1b179052611700516117e05101611820526118205180516101001b6101001c6117a0515f1b179052611740516117e051016118405261184051515f1c611860526117e051515f1c611880526118605160405261188051606052610f3061368052610af8565b6040516118a0526060516118c0526118a051515f1c6118e0526118e0516115c05155611700516117e051016119005261190051515f1c611920526117e051515f1c611940526119205160405261194051606052610f8f6136a0526104b3565b604051611960526060516119805261196051515f1c6119a0526119a0516117805155602051806117005180368337016020526119c0526119c05180516101001b6101001c611520515f1b179052611740516119c051016119e0526119e05180516101001b6101001c6113a0515f1b179052611700516119c05120611a0052611a005154611a2052611a20516112e0511c611a40526112c051611a405116611a605261130051611a605101611a80526001611aa052611a6051611a805111611ac052611a6051611a805114611ae052611ae051611ac05117611b0052611b005115611b2052611b205115611b4052611b4051611089576111ff565b61ffff611b6052611b6051611a805116611b80526001611ba052611b8051611a805114611bc052611bc05115611be052611be05115611c0052611c00516110cf576111fd565b6112a051611a205116611c20526112c051611a805116611c4052611c40516112e0511b611c6052611c6051611c205117611c8052611c8051611a0051556060611ca05260205180611ca0518036833701602052611cc0525f611ce052611ce051611cc05101611d0052611d005180516101001b6101001c611520515f1b1790526020611d2052611d2051611cc05101611d4052611d405180516101001b6101001c611260515f1b1790526040611d6052611d6051611cc05101611d8052611d805180516101001b6101001c611280515f1b179052611ca051611cc051a06113405115611da052611da05115611dc05260205180611d20518036833701602052611de052611de05180516101001b6101001c611dc0515f1b179052611de051604052611d20516060526136c051565bfe5bfe5bfe5bfe5b366132605261326051612ee0511061328052613280516112235760f5565b612e6051356132a052612ec051356132c0526132a0516040526132c05160605261124f61366052611267565b6040516132e05260605161330052613300516132e051f35b604051610c0052606051610c20525f610c40526001610c60526001610c8052610c8051610c605116610ca0526003610cc052610c4051610c005114610ce052610c8051610ce05118610d0052610d005115610d2052610d205115610d4052610d40516112d257611492565b33610d60526040610d805260205180610d80518036833701602052610da052610da05180516101001b6101001c610d60515f1b1790526020610dc052610dc051610da05101610de052610de05180516101001b6101001c610cc0515f1b179052610d8051610da05120610e005260205180610d80518036833701602052610e2052610e205180516101001b6101001c610c00515f1b179052610dc051610e205101610e4052610e405180516101001b6101001c610e00515f1b179052610d8051610e205120610e6052610c2051610e605155610e0051610e0051556060610e805260205180610e80518036833701602052610ea0525f610ec052610ec051610ea05101610ee052610ee05180516101001b6101001c610d60515f1b179052610dc051610ea05101610f0052610f005180516101001b6101001c610c00515f1b179052610d8051610ea05101610f2052610f205180516101001b6101001c610c20515f1b179052610e8051610ea051a0610ca05115610f4052610f405115610f605260205180610dc0518036833701602052610f8052610f805180516101001b6101001c610f60515f1b179052610f8051604052610dc05160605261366051565bfe5b366131a0526131a051612ee051106131c0526131c0516114b25760f5565b612e6051356131e052612ec05135613200526131e051604052613200516060526114de613640526114f6565b60405161322052606051613240526132405161322051f35b604051610a6052606051610a80526003610aa0526040610ac05260205180610ac0518036833701602052610ae052610ae05180516101001b6101001c610a60515f1b1790526020610b0052610b0051610ae05101610b2052610b205180516101001b6101001c610aa0515f1b179052610ac051610ae05120610b405260205180610ac0518036833701602052610b6052610b605180516101001b6101001c610a80515f1b179052610b0051610b605101610b8052610b805180516101001b6101001c610b40515f1b179052610ac051610b605120610ba052610ba05154610bc05260205180610b00518036833701602052610be052610be05180516101001b6101001c610bc0515f1b179052610be051604052610b005160605261364051565b366131005261310051612ea0511061312052613120516116345760f5565b612e605135613140526131405160405261165061362052611668565b60405161316052606051613180526131805161316051f35b60405161094052600261096052604061098052602051806109805180368337016020526109a0526109a05180516101001b6101001c610940515f1b17905260206109c0526109c0516109a051016109e0526109e05180516101001b6101001c610960515f1b179052610980516109a05120610a0052610a005154610a2052602051806109c0518036833701602052610a4052610a405180516101001b6101001c610a20515f1b179052610a40516040526109c05160605261362051565b366130805261308051612ea051106130a0526130a0516117435760f5565b612e6051356130c0526130c05160405261175f6136005261176e565b5f6130e0526130e0516130e051f35b6040516107e0526001610800527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd61082052600161084052610840516107e05116610860525f6108805261088051546108a052610820516108a051166108c0526108005161086051166108e0526108e051610800511b61090052610900516108c051176109205261092051610880515561360051565b6118106135e052611828565b60405161304052606051613060526130605161304051f35b6001610660525f6106805261068051546106a0526106a051610660511c6106c052610660516106c051166106e052610660516106e05116610700526001610720526107205161070051166107405261074051156107605261076051156107805260206107a052602051806107a05180368337016020526107c0526107c05180516101001b6101001c610780515f1b1790526107c0516040526107a0516060526135e051565b6118d96135c0526118f1565b60405161300052606051613020526130205161300051f35b60046105405260ff610560525f6105805261058051546105a0526105a051610540511c6105c052610560516105c051166105e052610560516105e051166106005260206106205260205180610620518036833701602052610640526106405180516101001b6101001c610600515f1b17905261064051604052610620516060526135c05156
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
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 = #x0000000000000000000000000000000000000000000000000000000000000000v_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 = #x0000000000000000000000000000000000000000000000000000000000000000v_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 = #xffffffffffffffffffffffffffffffffffffffffv_40178868192 = #x0000000000000000000000000000000000000000
Diagnostic 7
- Guard ID:
guard:erc20_bitfield_comptime_generics.ora:134:67:6:min_value:amount - Function:
transferFrom - Counterexample:
v_40178868144 = #xffffffffffffffffffffffffffffffffffffffffv_40178868240 = #x0000000000000000000000000000000000000000000000000000000000000000v_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
the Z3 result: