Add new keylets to util_keylet (#533)

This commit is contained in:
tequ
2026-02-18 10:18:59 +09:00
committed by GitHub
parent 36a99d4abc
commit 445f28ed30
4 changed files with 1171 additions and 701 deletions

View File

@@ -300,7 +300,17 @@ enum keylet_code : uint32_t {
NFT_OFFER = 23,
HOOK_DEFINITION = 24,
HOOK_STATE_DIR = 25,
CRON = 26
CRON = 26,
AMM = 27,
BRIDGE = 28,
XCHAIN_OWNED_CLAIM_ID = 29,
XCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID = 30,
DID = 31,
ORACLE = 32,
MPTOKEN_ISSUANCE = 33,
MPTOKEN = 34,
CREDENTIAL = 35,
PERMISSIONED_DOMAIN = 36,
};
}

View File

@@ -11414,7 +11414,19 @@ public:
#define KEYLET_PAYCHAN 21
#define KEYLET_EMITTED_TXN 22
#define KEYLET_NFT_OFFER 23
#define KEYLET_HOOK_DEFINITION 24
#define KEYLET_HOOK_STATE_DIR 25
#define KEYLET_CRON 26
#define KEYLET_AMM 27
#define KEYLET_BRIDGE 28
#define KEYLET_XCHAIN_OWNED_CLAIM_ID 29
#define KEYLET_XCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID 30
#define KEYLET_DID 31
#define KEYLET_ORACLE 32
#define KEYLET_MPTOKEN_ISSUANCE 33
#define KEYLET_MPTOKEN 34
#define KEYLET_CREDENTIAL 35
#define KEYLET_PERMISSIONED_DOMAIN 36
#define ASSERT(x)\
if (!(x))\
rollback((uint32_t)#x, sizeof(#x), __LINE__);
@@ -11462,6 +11474,22 @@ public:
0x3AU,0x51U,0x8AU,0x22U,0x53U,0x81U,0x60U,0x84U,0x1CU,0x14U,0x32U,0xFEU,
0x6FU,0x3EU,0x6DU,0x6EU,0x76U,0x29U,0xFBU,0xBAU
};
uint8_t asset1[] = // USD.rB6v18pQ765Z9DH5RQsTFevoQPFmRtBqhT
{
0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,
0x00U,0x00U,0x55U,0x53U,0x44U,0x00U,0x00U,0x00U,0x00U,0x00U,
0x75U,0x6EU,0xDEU,0x88U,0xA9U,0x07U,0xD4U,0xCCU,0xF3U,0x8DU,0x6AU,0xDBU,
0x9FU,0xC7U,0x94U,0x64U,0x19U,0xF0U,0xC4U,0x1DU
};
uint8_t asset2[] = // EUR.raKM1bZkGmASBqN5v2swrf2uAPJ32Cd8GV
{
0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,
0x00U,0x00U,0x45U,0x48U,0x52U,0x00U,0x00U,0x00U,0x00U,0x00U,
0x3AU,0x51U,0x8AU,0x22U,0x53U,0x81U,0x60U,0x84U,0x1CU,0x14U,0x32U,0xFEU,
0x6FU,0x3EU,0x6DU,0x6EU,0x76U,0x29U,0xFBU,0xBAU
};
int64_t hook(uint32_t reserved )
{
@@ -11916,11 +11944,76 @@ public:
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_NFT_OFFER,
SBUF(a), SBUF(ns),
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_HOOK_DEFINITION,
SBUF(ns),
0,0,
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_HOOK_STATE_DIR,
SBUF(a), SBUF(ns),
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_AMM,
SBUF(asset1), SBUF(asset2),
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_BRIDGE,
SBUF(a), SBUF(b),
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_XCHAIN_OWNED_CLAIM_ID,
SBUF(a), SBUF(b),
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_XCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID,
SBUF(a), SBUF(b),
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_DID,
SBUF(a),
0,0,
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_ORACLE,
SBUF(a), 3,
0,
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_MPTOKEN_ISSUANCE,
SBUF(a),
0,0,
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_MPTOKEN,
SBUF(a),
0,0,
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_CREDENTIAL,
SBUF(a), SBUF(b),
0,0
)));
ASSERT(INVALID_ARGUMENT == (e=util_keylet(buf, 34, KEYLET_PERMISSIONED_DOMAIN,
SBUF(a),
0,0,
0,0
)));
ASSERT(34 == (e=util_keylet(buf, 34, KEYLET_CRON, SBUF(a), 1, 0, 0, 0)));
{

File diff suppressed because it is too large Load Diff

View File

@@ -2327,7 +2327,13 @@ DEFINE_HOOK_FUNCTION(
case keylet_code::OWNER_DIR:
case keylet_code::SIGNERS:
case keylet_code::ACCOUNT:
case keylet_code::HOOK: {
case keylet_code::HOOK:
case keylet_code::DID: {
if (keylet_type == keylet_code::DID)
{
if (!applyCtx.view().rules().enabled(featureDID))
return INVALID_ARGUMENT;
}
if (a == 0 || b == 0)
return INVALID_ARGUMENT;
@@ -2350,13 +2356,43 @@ DEFINE_HOOK_FUNCTION(
? ripple::keylet::signers(id)
: keylet_type == keylet_code::OWNER_DIR
? ripple::keylet::ownerDir(id)
: keylet_type == keylet_code::DID
? ripple::keylet::did(id)
: ripple::keylet::account(id);
return serialize_keylet(kl, memory, write_ptr, write_len);
}
// keylets that take 20 byte account id, and (4 byte uint for 32
// byte hash)
// keylets that take 20 byte account id, and (4 byte uint for 32
// byte hash)
case keylet_code::ORACLE: {
if (!applyCtx.view().rules().enabled(featurePriceOracle))
return INVALID_ARGUMENT;
if (a == 0 || b == 0)
return INVALID_ARGUMENT;
if (d != 0 || e != 0 || f != 0)
return INVALID_ARGUMENT;
uint32_t read_ptr = a, read_len = b;
if (NOT_IN_BOUNDS(read_ptr, read_len, memory_length))
return OUT_OF_BOUNDS;
if (read_len != 20)
return INVALID_ARGUMENT;
ripple::AccountID id = AccountID::fromVoid(memory + read_ptr);
uint32_t seqId = c;
ripple::Keylet kl = ripple::keylet::oracle(id, seqId);
return serialize_keylet(kl, memory, write_ptr, write_len);
}
// keylets that take 20 byte account id, and UInt32or256 (4 byte
// uint or 32 byte hash)
case keylet_code::OFFER:
case keylet_code::CHECK:
case keylet_code::ESCROW:
@@ -2639,6 +2675,62 @@ DEFINE_HOOK_FUNCTION(
return serialize_keylet(kl, memory, write_ptr, write_len);
}
// keylets that take two 40 byte assets
case keylet_code::AMM: {
if (!applyCtx.view().rules().enabled(featureAMM))
return INVALID_ARGUMENT;
if (a == 0 || b == 0 || c == 0 || d == 0)
return INVALID_ARGUMENT;
if (e != 0 || f != 0)
return INVALID_ARGUMENT;
uint32_t aread_ptr = a, aread_len = b;
uint32_t bread_ptr = c, bread_len = d;
if (NOT_IN_BOUNDS(aread_ptr, aread_len, memory_length) ||
NOT_IN_BOUNDS(bread_ptr, bread_len, memory_length))
return OUT_OF_BOUNDS;
if (aread_len != 40 || bread_len != 40)
return INVALID_ARGUMENT;
Currency aCur = Currency::fromVoid(memory + aread_ptr);
Currency bCur = Currency::fromVoid(memory + bread_ptr);
AccountID aAcc = AccountID::fromVoid(memory + aread_ptr + 20);
AccountID bAcc = AccountID::fromVoid(memory + bread_ptr + 20);
Issue aIss = Issue{aCur, aAcc};
Issue bIss = Issue{bCur, bAcc};
ripple::Keylet kl =
ripple::keylet::amm(Asset{aIss}, Asset{bIss});
return serialize_keylet(kl, memory, write_ptr, write_len);
}
case keylet_code::BRIDGE:
case keylet_code::XCHAIN_OWNED_CLAIM_ID:
case keylet_code::XCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID: {
if (!applyCtx.view().rules().enabled(featureXChainBridge))
return INVALID_ARGUMENT;
}
case keylet_code::MPTOKEN_ISSUANCE:
case keylet_code::MPTOKEN: {
if (!applyCtx.view().rules().enabled(featureMPTokensV1))
return INVALID_ARGUMENT;
}
case keylet_code::CREDENTIAL: {
if (!applyCtx.view().rules().enabled(featureCredentials))
return INVALID_ARGUMENT;
}
case keylet_code::PERMISSIONED_DOMAIN: {
if (!applyCtx.view().rules().enabled(
featurePermissionedDomains))
return INVALID_ARGUMENT;
}
}
}
catch (std::exception& e)