Skip to content

Commit 87eb52d

Browse files
committed
support enbase58 and debase58 pre-compiled-ctr
1 parent ba41dee commit 87eb52d

File tree

11 files changed

+62
-8
lines changed

11 files changed

+62
-8
lines changed

libsolidity/analysis/GlobalContext.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ int magicVariableToID(std::string const& _name)
6464
else if (_name == "revertdiy") return -29;
6565
else if (_name == "db") return -30;
6666
else if (_name == "sm3") return -31;
67+
else if (_name == "enbase58") return -32;
68+
else if (_name == "debase58") return -33;
6769
else
6870
solAssert(false, "Unknown magic variable: \"" + _name + "\".");
6971
}
@@ -109,6 +111,9 @@ inline vector<shared_ptr<MagicVariableDeclaration const>> constructMagicVariable
109111
)),
110112
magicVarDecl("db", TypeProvider::magic(MagicType::Kind::Database)),
111113
magicVarDecl("sm3", TypeProvider::function(strings{"bytes memory"}, strings{"bytes32"}, FunctionType::Kind::SM3, false, StateMutability::Pure)),
114+
magicVarDecl("enbase58", TypeProvider::function(strings{"bytes memory"}, strings{"string memory"}, FunctionType::Kind::ENBASE58, false, StateMutability::Pure)),
115+
// magicVarDecl("enbase58", TypeProvider::function(strings{"bytes memory"}, strings{"string memory"}, FunctionType::Kind::ENBASE58, false, StateMutability::Pure)),
116+
magicVarDecl("debase58", TypeProvider::function(strings{"string memory"}, strings{"bytes20"}, FunctionType::Kind::DEBASE58, false, StateMutability::Pure)),
112117
};
113118
}
114119

libsolidity/analysis/TypeChecker.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,7 +2123,8 @@ void TypeChecker::typeCheckFunctionGeneralChecks(
21232123
_functionType->kind() == FunctionType::Kind::KECCAK256 ||
21242124
_functionType->kind() == FunctionType::Kind::SHA256 ||
21252125
_functionType->kind() == FunctionType::Kind::RIPEMD160 ||
2126-
_functionType->kind() == FunctionType::Kind::SM3
2126+
_functionType->kind() == FunctionType::Kind::SM3 ||
2127+
_functionType->kind() == FunctionType::Kind::ENBASE58
21272128
)
21282129
{
21292130
solAssert(!isVariadic, "");
@@ -2242,7 +2243,8 @@ void TypeChecker::typeCheckFunctionGeneralChecks(
22422243
_functionType->kind() == FunctionType::Kind::KECCAK256 ||
22432244
_functionType->kind() == FunctionType::Kind::SHA256 ||
22442245
_functionType->kind() == FunctionType::Kind::RIPEMD160 ||
2245-
_functionType->kind() == FunctionType::Kind::SM3
2246+
_functionType->kind() == FunctionType::Kind::SM3 ||
2247+
_functionType->kind() == FunctionType::Kind::ENBASE58
22462248
)
22472249
return {
22482250
7556_error,

libsolidity/ast/Types.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2896,6 +2896,8 @@ string FunctionType::richIdentifier() const
28962896
case Kind::ECRecover: id += "ecrecover"; break;
28972897
case Kind::SHA256: id += "sha256"; break;
28982898
case Kind::SM3: id += "sm3"; break;
2899+
case Kind::ENBASE58: id += "enbase58"; break;
2900+
case Kind::DEBASE58: id += "debase58"; break;
28992901
case Kind::RIPEMD160: id += "ripemd160"; break;
29002902
case Kind::GasLeft: id += "gasleft"; break;
29012903
case Kind::Event: id += "event"; break;
@@ -3433,6 +3435,8 @@ bool FunctionType::isBareCall() const
34333435
case Kind::SHA256:
34343436
case Kind::RIPEMD160:
34353437
case Kind::SM3:
3438+
case Kind::ENBASE58:
3439+
case Kind::DEBASE58:
34363440
return true;
34373441
default:
34383442
return false;
@@ -3497,6 +3501,8 @@ bool FunctionType::isPure() const
34973501
m_kind == Kind::SHA256 ||
34983502
m_kind == Kind::RIPEMD160 ||
34993503
m_kind == Kind::SM3 ||
3504+
m_kind == Kind::ENBASE58 ||
3505+
m_kind == Kind::DEBASE58 ||
35003506
m_kind == Kind::AddMod ||
35013507
m_kind == Kind::MulMod ||
35023508
m_kind == Kind::ObjectCreation ||
@@ -3631,6 +3637,8 @@ bool FunctionType::padArguments() const
36313637
case Kind::RIPEMD160:
36323638
case Kind::SM3:
36333639
case Kind::KECCAK256:
3640+
case Kind::ENBASE58:
3641+
case Kind::DEBASE58:
36343642
case Kind::ABIEncodePacked:
36353643
case Kind::CreateSQL:
36363644
case Kind::DropSQL:

libsolidity/ast/Types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,8 @@ class FunctionType: public Type
11961196

11971197
/* Begin chainsql preCompileContract */
11981198
SM3, ///< CALL to special contract for sm3
1199+
ENBASE58,
1200+
DEBASE58,
11991201
/* End chainsql preCompileContract */
12001202

12011203
RevertDIY
@@ -1371,6 +1373,7 @@ class FunctionType: public Type
13711373
case FunctionType::Kind::SHA256:
13721374
case FunctionType::Kind::RIPEMD160:
13731375
case FunctionType::Kind::SM3:
1376+
case FunctionType::Kind::ENBASE58:
13741377
case FunctionType::Kind::BareCall:
13751378
case FunctionType::Kind::BareCallCode:
13761379
case FunctionType::Kind::BareDelegateCall:

libsolidity/codegen/ExpressionCompiler.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,13 +1013,17 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
10131013
case FunctionType::Kind::SHA256:
10141014
case FunctionType::Kind::RIPEMD160:
10151015
case FunctionType::Kind::SM3:
1016+
case FunctionType::Kind::ENBASE58:
1017+
case FunctionType::Kind::DEBASE58:
10161018
{
10171019
_functionCall.expression().accept(*this);
10181020
static map<FunctionType::Kind, u256> const contractAddresses{
10191021
{FunctionType::Kind::ECRecover, 1},
10201022
{FunctionType::Kind::SHA256, 2},
10211023
{FunctionType::Kind::RIPEMD160, 3},
1022-
{FunctionType::Kind::SM3, 41},
1024+
{FunctionType::Kind::SM3, 0x4000},
1025+
{FunctionType::Kind::ENBASE58, 0x4001},
1026+
{FunctionType::Kind::DEBASE58, 0x4002},
10231027
};
10241028
m_context << contractAddresses.at(function.kind());
10251029
for (unsigned i = function.sizeOnStack(); i > 0; --i)
@@ -1028,6 +1032,11 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
10281032
appendExternalFunctionCall(function, arguments, false);
10291033
break;
10301034
}
1035+
/*case FunctionType::Kind::ENBASE58:
1036+
{
1037+
_functionCall.expression().accept(*this);
1038+
utils().fetchFreeMemoryPointer();
1039+
}*/
10311040
case FunctionType::Kind::ArrayPush:
10321041
{
10331042
solAssert(function.bound(), "");
@@ -1908,6 +1917,8 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
19081917
case FunctionType::Kind::SHA256:
19091918
case FunctionType::Kind::RIPEMD160:
19101919
case FunctionType::Kind::SM3:
1920+
case FunctionType::Kind::ENBASE58:
1921+
case FunctionType::Kind::DEBASE58:
19111922
default:
19121923
solAssert(false, "unsupported member function");
19131924
}
@@ -2892,7 +2903,7 @@ void ExpressionCompiler::appendExternalFunctionCall(
28922903

28932904
solAssert(funKind != FunctionType::Kind::BareCallCode, "Callcode has been removed.");
28942905

2895-
bool returnSuccessConditionAndReturndata = funKind == FunctionType::Kind::BareCall || funKind == FunctionType::Kind::BareDelegateCall || funKind == FunctionType::Kind::BareStaticCall;
2906+
bool returnSuccessConditionAndReturndata = funKind == FunctionType::Kind::ENBASE58 || funKind == FunctionType::Kind::BareCall || funKind == FunctionType::Kind::BareDelegateCall || funKind == FunctionType::Kind::BareStaticCall;
28962907
bool isDelegateCall = funKind == FunctionType::Kind::BareDelegateCall || funKind == FunctionType::Kind::DelegateCall;
28972908
bool useStaticCall = funKind == FunctionType::Kind::BareStaticCall || (_functionType.stateMutability() <= StateMutability::View && m_context.evmVersion().hasStaticCall());
28982909

libsolidity/codegen/ir/IRGeneratorForStatements.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,8 @@ void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall)
14301430
case FunctionType::Kind::RIPEMD160:
14311431
case FunctionType::Kind::SHA256:
14321432
case FunctionType::Kind::SM3:
1433+
case FunctionType::Kind::ENBASE58:
1434+
case FunctionType::Kind::DEBASE58:
14331435
{
14341436
solAssert(!_functionCall.annotation().tryCall, "");
14351437
solAssert(!functionType->valueSet(), "");
@@ -1440,7 +1442,9 @@ void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall)
14401442
{FunctionType::Kind::ECRecover, std::make_tuple(1, 0)},
14411443
{FunctionType::Kind::SHA256, std::make_tuple(2, 0)},
14421444
{FunctionType::Kind::RIPEMD160, std::make_tuple(3, 12)},
1443-
{FunctionType::Kind::SM3, std::make_tuple(41, 0)}
1445+
{FunctionType::Kind::SM3, std::make_tuple(0x1002, 0)},
1446+
{FunctionType::Kind::ENBASE58, std::make_tuple(0x1003, 0)},
1447+
{FunctionType::Kind::DEBASE58, std::make_tuple(0x1004, 0)}
14441448
};
14451449
auto [ address, offset ] = precompiles[functionType->kind()];
14461450
TypePointers argumentTypes;
@@ -1948,6 +1952,8 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
19481952
case FunctionType::Kind::SHA256:
19491953
case FunctionType::Kind::RIPEMD160:
19501954
case FunctionType::Kind::SM3:
1955+
case FunctionType::Kind::ENBASE58:
1956+
case FunctionType::Kind::DEBASE58:
19511957
default:
19521958
solAssert(false, "unsupported member function");
19531959
}

libsolidity/formal/BMC.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ void BMC::endVisit(FunctionCall const& _funCall)
451451
case FunctionType::Kind::SHA256:
452452
case FunctionType::Kind::RIPEMD160:
453453
case FunctionType::Kind::SM3:
454+
case FunctionType::Kind::ENBASE58:
455+
case FunctionType::Kind::DEBASE58:
454456
case FunctionType::Kind::BlockHash:
455457
case FunctionType::Kind::AddMod:
456458
case FunctionType::Kind::MulMod:

libsolidity/formal/CHC.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,8 @@ void CHC::endVisit(FunctionCall const& _funCall)
529529
case FunctionType::Kind::SHA256:
530530
case FunctionType::Kind::RIPEMD160:
531531
case FunctionType::Kind::SM3:
532+
case FunctionType::Kind::ENBASE58:
533+
case FunctionType::Kind::DEBASE58:
532534
case FunctionType::Kind::BlockHash:
533535
case FunctionType::Kind::AddMod:
534536
case FunctionType::Kind::MulMod:

libsolidity/formal/SMTEncoder.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,8 @@ void SMTEncoder::endVisit(FunctionCall const& _funCall)
613613
case FunctionType::Kind::SHA256:
614614
case FunctionType::Kind::RIPEMD160:
615615
case FunctionType::Kind::SM3:
616+
case FunctionType::Kind::ENBASE58:
617+
case FunctionType::Kind::DEBASE58:
616618
visitCryptoFunction(_funCall);
617619
break;
618620
case FunctionType::Kind::BlockHash:
@@ -776,6 +778,10 @@ void SMTEncoder::visitCryptoFunction(FunctionCall const& _funCall)
776778
result = smtutil::Expression::select(state().cryptoFunction("sha256"), arg0);
777779
else if (kind == FunctionType::Kind::SM3)
778780
result = smtutil::Expression::select(state().cryptoFunction("sm3"), arg0);
781+
else if (kind == FunctionType::Kind::ENBASE58)
782+
result = smtutil::Expression::select(state().cryptoFunction("enbase58"), arg0);
783+
else if (kind == FunctionType::Kind::DEBASE58)
784+
result = smtutil::Expression::select(state().cryptoFunction("debase58"), arg0);
779785
else if (kind == FunctionType::Kind::RIPEMD160)
780786
result = smtutil::Expression::select(state().cryptoFunction("ripemd160"), arg0);
781787
else if (kind == FunctionType::Kind::ECRecover)
@@ -1177,10 +1183,10 @@ void SMTEncoder::visitStructConstructorCall(FunctionCall const& _funCall)
11771183
auto const& structMembers = structType->structDefinition().members();
11781184
solAssert(structMembers.size() == _funCall.sortedArguments().size(), "");
11791185
auto args = _funCall.sortedArguments();
1180-
structSymbolicVar.assignAllMembers(applyMap(
1186+
/*structSymbolicVar.assignAllMembers(applyMap(
11811187
ranges::views::zip(args, structMembers),
11821188
[this] (auto const& argMemberPair) { return expr(*argMemberPair.first, argMemberPair.second->type()); }
1183-
));
1189+
));*/
11841190
}
11851191

11861192
}

libsolidity/formal/SymbolicState.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ class SymbolicState
224224
smt::smtSort(*TypeProvider::bytesStorage()),
225225
smtSort(*TypeProvider::fixedBytes(32))
226226
)},
227+
{"enbase58", std::make_shared<smtutil::ArraySort>(
228+
smt::smtSort(*TypeProvider::bytesStorage()),
229+
smtSort(*TypeProvider::stringStorage())
230+
)},
231+
{"debase58", std::make_shared<smtutil::ArraySort>(
232+
smt::smtSort(*TypeProvider::stringStorage()),
233+
smtSort(*TypeProvider::fixedBytes(20))
234+
)},
227235
{"ripemd160", std::make_shared<smtutil::ArraySort>(
228236
smt::smtSort(*TypeProvider::bytesStorage()),
229237
smtSort(*TypeProvider::fixedBytes(20))

0 commit comments

Comments
 (0)