$ include "seed7_05.s7i"; include "msgdigest.s7i"; include "encoding.s7i"; const func boolean: validBitcoinAddress (in string: address) is func result var boolean: isValid is FALSE; local var string: decoded is ""; begin if succeeds(decoded := fromBase58(address)) and length(decoded) = 25 and decoded[1] = '\0;' and sha256(sha256(decoded[.. 21]))[.. 4] = decoded[22 ..] then isValid := TRUE; end if; end func; const proc: checkValidationFunction (in string: address, in boolean: expected) is func local var boolean: isValid is FALSE; begin isValid := validBitcoinAddress(address); writeln((address <& ": ") rpad 37 <& isValid); if isValid <> expected then writeln(" *** Expected " <& expected <& " for " <& address <& ", but got " <& isValid <& "."); end if; end func; const proc: main is func begin checkValidationFunction("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", TRUE); # okay checkValidationFunction("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", FALSE); # bad digest checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", TRUE); # okay checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", FALSE); # bad digest checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", FALSE); # bad digest checkValidationFunction("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", FALSE); # bad digest checkValidationFunction("oMRDCDfyQhEerkaSmwCfSPqf3MLgBwNvs", FALSE); # not version 0 checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", FALSE); # wrong length checkValidationFunction("1BGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", FALSE); # bad digest checkValidationFunction("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", FALSE); # bad char checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", FALSE); # bad char checkValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", FALSE); # bad char checkValidationFunction("1AGNa15ZQXAZUgFiqJ3i7Z2DPU2J6hW62i", FALSE); # bad digest checkValidationFunction("1111111111111111111114oLvT2", TRUE); # okay checkValidationFunction("17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j", TRUE); # okay checkValidationFunction("1badbadbadbadbadbadbadbadbadbadbad", FALSE); # wrong length checkValidationFunction("BZbvjr", FALSE); # wrong length checkValidationFunction("i55j", FALSE); # wrong length checkValidationFunction("16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM", TRUE); # okay end func;