Price Oracle (XLS-47d): (#4789) (#4789)

Implement native support for Price Oracles.

 A Price Oracle is used to bring real-world data, such as market prices,
 onto the blockchain, enabling dApps to access and utilize information
 that resides outside the blockchain.

 Add Price Oracle functionality:
 - OracleSet: create or update the Oracle object
 - OracleDelete: delete the Oracle object

 To support this functionality add:
 - New RPC method, `get_aggregate_price`, to calculate aggregate price for a token pair of the specified oracles
 - `ltOracle` object

 The `ltOracle` object maintains:
 - Oracle Owner's account
 - Oracle's metadata
 - Up to ten token pairs with the scaled price
 - The last update time the token pairs were updated

 Add Oracle unit-tests
This commit is contained in:
Gregory Tsipenyuk
2024-02-26 06:28:26 -05:00
committed by tequ
parent 897ab2662c
commit 50f8ecc3e6
40 changed files with 2865 additions and 8 deletions

View File

@@ -91,6 +91,7 @@ CONSTRUCT_UNTYPED_SFIELD(sfMetadata, "Metadata", METADATA
CONSTRUCT_TYPED_SFIELD(sfCloseResolution, "CloseResolution", UINT8, 1);
CONSTRUCT_TYPED_SFIELD(sfMethod, "Method", UINT8, 2);
CONSTRUCT_TYPED_SFIELD(sfTransactionResult, "TransactionResult", UINT8, 3);
CONSTRUCT_TYPED_SFIELD(sfScale, "Scale", UINT8, 4);
// 8-bit integers (uncommon)
CONSTRUCT_TYPED_SFIELD(sfTickSize, "TickSize", UINT8, 16);
@@ -128,6 +129,7 @@ CONSTRUCT_TYPED_SFIELD(sfTransferRate, "TransferRate", UINT32,
CONSTRUCT_TYPED_SFIELD(sfWalletSize, "WalletSize", UINT32, 12);
CONSTRUCT_TYPED_SFIELD(sfOwnerCount, "OwnerCount", UINT32, 13);
CONSTRUCT_TYPED_SFIELD(sfDestinationTag, "DestinationTag", UINT32, 14);
CONSTRUCT_TYPED_SFIELD(sfLastUpdateTime, "LastUpdateTime", UINT32, 15);
// 32-bit integers (uncommon)
CONSTRUCT_TYPED_SFIELD(sfHighQualityIn, "HighQualityIn", UINT32, 16);
@@ -166,6 +168,7 @@ CONSTRUCT_TYPED_SFIELD(sfVoteWeight, "VoteWeight", UINT32,
CONSTRUCT_TYPED_SFIELD(sfLockCount, "LockCount", UINT32, 49);
CONSTRUCT_TYPED_SFIELD(sfFirstNFTokenSequence, "FirstNFTokenSequence", UINT32, 50);
CONSTRUCT_TYPED_SFIELD(sfOracleDocumentID, "OracleDocumentID", UINT32, 51);
CONSTRUCT_TYPED_SFIELD(sfXahauActivationLgrSeq, "XahauActivationLgrSeq",UINT32, 96);
CONSTRUCT_TYPED_SFIELD(sfImportSequence, "ImportSequence", UINT32, 97);
@@ -196,6 +199,7 @@ CONSTRUCT_TYPED_SFIELD(sfReferenceCount, "ReferenceCount", UINT64,
CONSTRUCT_TYPED_SFIELD(sfXChainClaimID, "XChainClaimID", UINT64, 20);
CONSTRUCT_TYPED_SFIELD(sfXChainAccountCreateCount, "XChainAccountCreateCount", UINT64, 21);
CONSTRUCT_TYPED_SFIELD(sfXChainAccountClaimCount, "XChainAccountClaimCount", UINT64, 22);
CONSTRUCT_TYPED_SFIELD(sfAssetPrice, "AssetPrice", UINT64, 23);
CONSTRUCT_TYPED_SFIELD(sfTouchCount, "TouchCount", UINT64, 97);
CONSTRUCT_TYPED_SFIELD(sfAccountIndex, "AccountIndex", UINT64, 98);
CONSTRUCT_TYPED_SFIELD(sfAccountCount, "AccountCount", UINT64, 99);
@@ -321,6 +325,8 @@ CONSTRUCT_TYPED_SFIELD(sfHookParameterValue, "HookParameterValue", VL,
CONSTRUCT_TYPED_SFIELD(sfBlob, "Blob", VL, 26);
CONSTRUCT_TYPED_SFIELD(sfDIDDocument, "DIDDocument", VL, 27);
CONSTRUCT_TYPED_SFIELD(sfData, "Data", VL, 28);
CONSTRUCT_TYPED_SFIELD(sfAssetClass, "AssetClass", VL, 29);
CONSTRUCT_TYPED_SFIELD(sfProvider, "Provider", VL, 30);
CONSTRUCT_TYPED_SFIELD(sfRemarkValue, "RemarkValue", VL, 98);
CONSTRUCT_TYPED_SFIELD(sfRemarkName, "RemarkName", VL, 99);
@@ -357,6 +363,10 @@ CONSTRUCT_TYPED_SFIELD(sfURITokenIDs, "URITokenIDs", VECTOR25
// path set
CONSTRUCT_UNTYPED_SFIELD(sfPaths, "Paths", PATHSET, 1);
// currency
CONSTRUCT_TYPED_SFIELD(sfBaseAsset, "BaseAsset", CURRENCY, 1);
CONSTRUCT_TYPED_SFIELD(sfQuoteAsset, "QuoteAsset", CURRENCY, 2);
// issue
CONSTRUCT_TYPED_SFIELD(sfLockingChainIssue, "LockingChainIssue", ISSUE, 1);
CONSTRUCT_TYPED_SFIELD(sfIssuingChainIssue, "IssuingChainIssue", ISSUE, 2);
@@ -405,6 +415,7 @@ CONSTRUCT_UNTYPED_SFIELD(sfXChainClaimAttestationCollectionElement,
CONSTRUCT_UNTYPED_SFIELD(sfXChainCreateAccountAttestationCollectionElement,
"XChainCreateAccountAttestationCollectionElement",
OBJECT, 31);
CONSTRUCT_UNTYPED_SFIELD(sfPriceData, "PriceData", OBJECT, 32);
CONSTRUCT_UNTYPED_SFIELD(sfRemark, "Remark", OBJECT, 97);
CONSTRUCT_UNTYPED_SFIELD(sfGenesisMint, "GenesisMint", OBJECT, 96);
CONSTRUCT_UNTYPED_SFIELD(sfActiveValidator, "ActiveValidator", OBJECT, 95);
@@ -439,7 +450,8 @@ CONSTRUCT_UNTYPED_SFIELD(sfXChainClaimAttestations,
CONSTRUCT_UNTYPED_SFIELD(sfXChainCreateAccountAttestations,
"XChainCreateAccountAttestations",
ARRAY, 22);
// 23 and 24 are unused and available for use
// 23 is unused and available for use
CONSTRUCT_UNTYPED_SFIELD(sfPriceDataSeries, "PriceDataSeries", ARRAY, 24);
CONSTRUCT_UNTYPED_SFIELD(sfAuthAccounts, "AuthAccounts", ARRAY, 25);
CONSTRUCT_UNTYPED_SFIELD(sfRemarks, "Remarks", ARRAY, 97);
CONSTRUCT_UNTYPED_SFIELD(sfGenesisMints, "GenesisMints", ARRAY, 96);