phantasma-sdk-ts 0.1.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +13 -0
- package/.eslintrc.cjs +15 -0
- package/.github/workflows/npm-publish.yml +47 -0
- package/.prettierignore +13 -0
- package/.prettierrc +8 -0
- package/LICENSE +201 -0
- package/README.md +842 -0
- package/babel.config.js +6 -0
- package/core/index.d.ts +10 -0
- package/core/index.d.ts.map +1 -0
- package/core/index.js +25 -0
- package/core/interfaces/IContract.d.ts +27 -0
- package/core/interfaces/IContract.d.ts.map +1 -0
- package/core/interfaces/IContract.js +25 -0
- package/core/interfaces/IKeyPair.d.ts +7 -0
- package/core/interfaces/IKeyPair.d.ts.map +1 -0
- package/core/interfaces/IKeyPair.js +2 -0
- package/core/interfaces/ISerializable.d.ts +6 -0
- package/core/interfaces/ISerializable.d.ts.map +1 -0
- package/core/interfaces/ISerializable.js +9 -0
- package/core/interfaces/IStack.d.ts +7 -0
- package/core/interfaces/IStack.d.ts.map +1 -0
- package/core/interfaces/IStack.js +2 -0
- package/core/interfaces/IToken.d.ts +29 -0
- package/core/interfaces/IToken.d.ts.map +1 -0
- package/core/interfaces/IToken.js +22 -0
- package/core/interfaces/Signature.d.ts +21 -0
- package/core/interfaces/Signature.d.ts.map +1 -0
- package/core/interfaces/Signature.js +31 -0
- package/core/interfaces/index.d.ts +7 -0
- package/core/interfaces/index.d.ts.map +1 -0
- package/core/interfaces/index.js +22 -0
- package/core/ledger/Address-Transcode.d.ts +20 -0
- package/core/ledger/Address-Transcode.d.ts.map +1 -0
- package/core/ledger/Address-Transcode.js +70 -0
- package/core/ledger/Ledger-Commands.d.ts +76 -0
- package/core/ledger/Ledger-Commands.d.ts.map +1 -0
- package/core/ledger/Ledger-Commands.js +530 -0
- package/core/ledger/Ledger-Utils.d.ts +74 -0
- package/core/ledger/Ledger-Utils.d.ts.map +1 -0
- package/core/ledger/Ledger-Utils.js +609 -0
- package/core/ledger/LedgerConfig.d.ts +17 -0
- package/core/ledger/LedgerConfig.d.ts.map +1 -0
- package/core/ledger/LedgerConfig.js +2 -0
- package/core/ledger/Mnemonic.d.ts +35 -0
- package/core/ledger/Mnemonic.d.ts.map +1 -0
- package/core/ledger/Mnemonic.js +65 -0
- package/core/ledger/Transaction-Sign.d.ts +10 -0
- package/core/ledger/Transaction-Sign.d.ts.map +1 -0
- package/core/ledger/Transaction-Sign.js +149 -0
- package/core/ledger/Transaction-Transcode.d.ts +24 -0
- package/core/ledger/Transaction-Transcode.d.ts.map +1 -0
- package/core/ledger/Transaction-Transcode.js +47 -0
- package/core/ledger/index.d.ts +9 -0
- package/core/ledger/index.d.ts.map +1 -0
- package/core/ledger/index.js +24 -0
- package/core/ledger/interfaces/ApplicationNameResponse.d.ts +6 -0
- package/core/ledger/interfaces/ApplicationNameResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/ApplicationNameResponse.js +2 -0
- package/core/ledger/interfaces/Device.d.ts +7 -0
- package/core/ledger/interfaces/Device.d.ts.map +1 -0
- package/core/ledger/interfaces/Device.js +2 -0
- package/core/ledger/interfaces/DeviceResponse.d.ts +7 -0
- package/core/ledger/interfaces/DeviceResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/DeviceResponse.js +2 -0
- package/core/ledger/interfaces/Ledger.d.ts +2 -0
- package/core/ledger/interfaces/Ledger.d.ts.map +1 -0
- package/core/ledger/interfaces/Ledger.js +2 -0
- package/core/ledger/interfaces/LedgerBalanceFromLedgerResponse.d.ts +12 -0
- package/core/ledger/interfaces/LedgerBalanceFromLedgerResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerBalanceFromLedgerResponse.js +2 -0
- package/core/ledger/interfaces/LedgerConfig.d.ts +17 -0
- package/core/ledger/interfaces/LedgerConfig.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerConfig.js +2 -0
- package/core/ledger/interfaces/LedgerDeviceInfoResponse.d.ts +7 -0
- package/core/ledger/interfaces/LedgerDeviceInfoResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerDeviceInfoResponse.js +2 -0
- package/core/ledger/interfaces/LedgerSendTransactionResponse.d.ts +5 -0
- package/core/ledger/interfaces/LedgerSendTransactionResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerSendTransactionResponse.js +2 -0
- package/core/ledger/interfaces/LedgerSigner.d.ts +6 -0
- package/core/ledger/interfaces/LedgerSigner.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerSigner.js +2 -0
- package/core/ledger/interfaces/LedgerSignerData.d.ts +8 -0
- package/core/ledger/interfaces/LedgerSignerData.d.ts.map +1 -0
- package/core/ledger/interfaces/LedgerSignerData.js +2 -0
- package/core/ledger/interfaces/PublicKeyResponse.d.ts +6 -0
- package/core/ledger/interfaces/PublicKeyResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/PublicKeyResponse.js +2 -0
- package/core/ledger/interfaces/SignResponse.d.ts +6 -0
- package/core/ledger/interfaces/SignResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/SignResponse.js +2 -0
- package/core/ledger/interfaces/VersionResponse.d.ts +6 -0
- package/core/ledger/interfaces/VersionResponse.d.ts.map +1 -0
- package/core/ledger/interfaces/VersionResponse.js +2 -0
- package/core/ledger/interfaces/index.d.ts +14 -0
- package/core/ledger/interfaces/index.d.ts.map +1 -0
- package/core/ledger/interfaces/index.js +29 -0
- package/core/ledger/ledger-comm.d.ts +85 -0
- package/core/ledger/ledger-comm.d.ts.map +1 -0
- package/core/ledger/ledger-comm.js +613 -0
- package/core/link/easyConnect.d.ts +23 -0
- package/core/link/easyConnect.d.ts.map +1 -0
- package/core/link/easyConnect.js +237 -0
- package/core/link/easyScript.d.ts +13 -0
- package/core/link/easyScript.d.ts.map +1 -0
- package/core/link/easyScript.js +52 -0
- package/core/link/index.d.ts +2 -0
- package/core/link/index.d.ts.map +1 -0
- package/core/link/index.js +17 -0
- package/core/link/interfaces/IAccount.d.ts +13 -0
- package/core/link/interfaces/IAccount.d.ts.map +1 -0
- package/core/link/interfaces/IAccount.js +2 -0
- package/core/link/interfaces/IFile.d.ts +7 -0
- package/core/link/interfaces/IFile.d.ts.map +1 -0
- package/core/link/interfaces/IFile.js +2 -0
- package/core/link/interfaces/ProofOfWork.d.ts +9 -0
- package/core/link/interfaces/ProofOfWork.d.ts.map +1 -0
- package/core/link/interfaces/ProofOfWork.js +12 -0
- package/core/link/interfaces/index.d.ts +4 -0
- package/core/link/interfaces/index.d.ts.map +1 -0
- package/core/link/interfaces/index.js +19 -0
- package/core/link/phantasmaLink.d.ts +41 -0
- package/core/link/phantasmaLink.d.ts.map +1 -0
- package/core/link/phantasmaLink.js +479 -0
- package/core/rpc/index.d.ts +3 -0
- package/core/rpc/index.d.ts.map +1 -0
- package/core/rpc/index.js +18 -0
- package/core/rpc/interfaces/ABIContract.d.ts +6 -0
- package/core/rpc/interfaces/ABIContract.d.ts.map +1 -0
- package/core/rpc/interfaces/ABIContract.js +2 -0
- package/core/rpc/interfaces/ABIEvent.d.ts +7 -0
- package/core/rpc/interfaces/ABIEvent.d.ts.map +1 -0
- package/core/rpc/interfaces/ABIEvent.js +2 -0
- package/core/rpc/interfaces/ABIMethod.d.ts +7 -0
- package/core/rpc/interfaces/ABIMethod.d.ts.map +1 -0
- package/core/rpc/interfaces/ABIMethod.js +2 -0
- package/core/rpc/interfaces/ABIParameter.d.ts +5 -0
- package/core/rpc/interfaces/ABIParameter.d.ts.map +1 -0
- package/core/rpc/interfaces/ABIParameter.js +2 -0
- package/core/rpc/interfaces/Account.d.ts +16 -0
- package/core/rpc/interfaces/Account.d.ts.map +1 -0
- package/core/rpc/interfaces/Account.js +2 -0
- package/core/rpc/interfaces/AccountTransactions.d.ts +6 -0
- package/core/rpc/interfaces/AccountTransactions.d.ts.map +1 -0
- package/core/rpc/interfaces/AccountTransactions.js +2 -0
- package/core/rpc/interfaces/Archive.d.ts +11 -0
- package/core/rpc/interfaces/Archive.d.ts.map +1 -0
- package/core/rpc/interfaces/Archive.js +2 -0
- package/core/rpc/interfaces/Auction.d.ts +13 -0
- package/core/rpc/interfaces/Auction.d.ts.map +1 -0
- package/core/rpc/interfaces/Auction.js +2 -0
- package/core/rpc/interfaces/Balance.d.ts +8 -0
- package/core/rpc/interfaces/Balance.d.ts.map +1 -0
- package/core/rpc/interfaces/Balance.js +2 -0
- package/core/rpc/interfaces/Block.d.ts +17 -0
- package/core/rpc/interfaces/Block.d.ts.map +1 -0
- package/core/rpc/interfaces/Block.js +2 -0
- package/core/rpc/interfaces/Chain.d.ts +10 -0
- package/core/rpc/interfaces/Chain.d.ts.map +1 -0
- package/core/rpc/interfaces/Chain.js +2 -0
- package/core/rpc/interfaces/Channel.d.ts +13 -0
- package/core/rpc/interfaces/Channel.d.ts.map +1 -0
- package/core/rpc/interfaces/Channel.js +2 -0
- package/core/rpc/interfaces/Contract.d.ts +11 -0
- package/core/rpc/interfaces/Contract.d.ts.map +1 -0
- package/core/rpc/interfaces/Contract.js +2 -0
- package/core/rpc/interfaces/Dapp.d.ts +6 -0
- package/core/rpc/interfaces/Dapp.d.ts.map +1 -0
- package/core/rpc/interfaces/Dapp.js +2 -0
- package/core/rpc/interfaces/Event.d.ts +7 -0
- package/core/rpc/interfaces/Event.d.ts.map +1 -0
- package/core/rpc/interfaces/Event.js +2 -0
- package/core/rpc/interfaces/Governance.d.ts +5 -0
- package/core/rpc/interfaces/Governance.d.ts.map +1 -0
- package/core/rpc/interfaces/Governance.js +2 -0
- package/core/rpc/interfaces/Interop.d.ts +5 -0
- package/core/rpc/interfaces/Interop.d.ts.map +1 -0
- package/core/rpc/interfaces/Interop.js +2 -0
- package/core/rpc/interfaces/KeyValue.d.ts +5 -0
- package/core/rpc/interfaces/KeyValue.d.ts.map +1 -0
- package/core/rpc/interfaces/KeyValue.js +2 -0
- package/core/rpc/interfaces/Leaderboard.d.ts +6 -0
- package/core/rpc/interfaces/Leaderboard.d.ts.map +1 -0
- package/core/rpc/interfaces/Leaderboard.js +2 -0
- package/core/rpc/interfaces/LeaderboardRow.d.ts +5 -0
- package/core/rpc/interfaces/LeaderboardRow.d.ts.map +1 -0
- package/core/rpc/interfaces/LeaderboardRow.js +2 -0
- package/core/rpc/interfaces/NFT.d.ts +14 -0
- package/core/rpc/interfaces/NFT.d.ts.map +1 -0
- package/core/rpc/interfaces/NFT.js +2 -0
- package/core/rpc/interfaces/Nexus.d.ts +14 -0
- package/core/rpc/interfaces/Nexus.d.ts.map +1 -0
- package/core/rpc/interfaces/Nexus.js +2 -0
- package/core/rpc/interfaces/Oracle.d.ts +5 -0
- package/core/rpc/interfaces/Oracle.d.ts.map +1 -0
- package/core/rpc/interfaces/Oracle.js +2 -0
- package/core/rpc/interfaces/Organization.d.ts +6 -0
- package/core/rpc/interfaces/Organization.d.ts.map +1 -0
- package/core/rpc/interfaces/Organization.js +2 -0
- package/core/rpc/interfaces/Paginated.d.ts +8 -0
- package/core/rpc/interfaces/Paginated.d.ts.map +1 -0
- package/core/rpc/interfaces/Paginated.js +2 -0
- package/core/rpc/interfaces/Peer.d.ts +8 -0
- package/core/rpc/interfaces/Peer.d.ts.map +1 -0
- package/core/rpc/interfaces/Peer.js +2 -0
- package/core/rpc/interfaces/Platform.d.ts +9 -0
- package/core/rpc/interfaces/Platform.d.ts.map +1 -0
- package/core/rpc/interfaces/Platform.js +2 -0
- package/core/rpc/interfaces/Receipt.d.ts +10 -0
- package/core/rpc/interfaces/Receipt.d.ts.map +1 -0
- package/core/rpc/interfaces/Receipt.js +2 -0
- package/core/rpc/interfaces/Script.d.ts +9 -0
- package/core/rpc/interfaces/Script.d.ts.map +1 -0
- package/core/rpc/interfaces/Script.js +2 -0
- package/core/rpc/interfaces/SendRawTx.d.ts +5 -0
- package/core/rpc/interfaces/SendRawTx.d.ts.map +1 -0
- package/core/rpc/interfaces/SendRawTx.js +2 -0
- package/core/rpc/interfaces/SignatureResult.d.ts +5 -0
- package/core/rpc/interfaces/SignatureResult.d.ts.map +1 -0
- package/core/rpc/interfaces/SignatureResult.js +2 -0
- package/core/rpc/interfaces/Stake.d.ts +6 -0
- package/core/rpc/interfaces/Stake.d.ts.map +1 -0
- package/core/rpc/interfaces/Stake.js +2 -0
- package/core/rpc/interfaces/Storage.d.ts +8 -0
- package/core/rpc/interfaces/Storage.d.ts.map +1 -0
- package/core/rpc/interfaces/Storage.js +2 -0
- package/core/rpc/interfaces/Swap.d.ts +13 -0
- package/core/rpc/interfaces/Swap.d.ts.map +1 -0
- package/core/rpc/interfaces/Swap.js +2 -0
- package/core/rpc/interfaces/Token.d.ts +19 -0
- package/core/rpc/interfaces/Token.d.ts.map +1 -0
- package/core/rpc/interfaces/Token.js +2 -0
- package/core/rpc/interfaces/TokenData.d.ts +13 -0
- package/core/rpc/interfaces/TokenData.d.ts.map +1 -0
- package/core/rpc/interfaces/TokenData.js +2 -0
- package/core/rpc/interfaces/TokenExternal.d.ts +5 -0
- package/core/rpc/interfaces/TokenExternal.d.ts.map +1 -0
- package/core/rpc/interfaces/TokenExternal.js +2 -0
- package/core/rpc/interfaces/TokenPrice.d.ts +8 -0
- package/core/rpc/interfaces/TokenPrice.d.ts.map +1 -0
- package/core/rpc/interfaces/TokenPrice.js +2 -0
- package/core/rpc/interfaces/TokenSeries.d.ts +12 -0
- package/core/rpc/interfaces/TokenSeries.d.ts.map +1 -0
- package/core/rpc/interfaces/TokenSeries.js +2 -0
- package/core/rpc/interfaces/TransactionData.d.ts +23 -0
- package/core/rpc/interfaces/TransactionData.d.ts.map +1 -0
- package/core/rpc/interfaces/TransactionData.js +2 -0
- package/core/rpc/interfaces/Validator.d.ts +5 -0
- package/core/rpc/interfaces/Validator.d.ts.map +1 -0
- package/core/rpc/interfaces/Validator.js +2 -0
- package/core/rpc/interfaces/index.d.ts +42 -0
- package/core/rpc/interfaces/index.d.ts.map +1 -0
- package/core/rpc/interfaces/index.js +57 -0
- package/core/rpc/phantasma.d.ts +89 -0
- package/core/rpc/phantasma.d.ts.map +1 -0
- package/core/rpc/phantasma.js +900 -0
- package/core/tx/SignatureKind.js +9 -0
- package/core/tx/Transaction.d.ts +28 -0
- package/core/tx/Transaction.d.ts.map +1 -0
- package/core/tx/Transaction.js +209 -0
- package/core/tx/index.d.ts +3 -0
- package/core/tx/index.d.ts.map +1 -0
- package/core/tx/index.js +18 -0
- package/core/tx/utils.d.ts +10 -0
- package/core/tx/utils.d.ts.map +1 -0
- package/core/tx/utils.js +147 -0
- package/core/types/Address.d.ts +41 -0
- package/core/types/Address.d.ts.map +1 -0
- package/core/types/Address.js +276 -0
- package/core/types/Consensus.d.ts +61 -0
- package/core/types/Consensus.d.ts.map +1 -0
- package/core/types/Consensus.js +151 -0
- package/core/types/Contract.d.ts +60 -0
- package/core/types/Contract.d.ts.map +1 -0
- package/core/types/Contract.js +342 -0
- package/core/types/DomainSettings.d.ts +87 -0
- package/core/types/DomainSettings.d.ts.map +1 -0
- package/core/types/DomainSettings.js +107 -0
- package/core/types/Ed25519Signature.d.ts +16 -0
- package/core/types/Ed25519Signature.d.ts.map +1 -0
- package/core/types/Ed25519Signature.js +78 -0
- package/core/types/Entropy.d.ts +5 -0
- package/core/types/Entropy.d.ts.map +1 -0
- package/core/types/Entropy.js +24 -0
- package/core/types/Extensions/Base16.d.ts +7 -0
- package/core/types/Extensions/Base16.d.ts.map +1 -0
- package/core/types/Extensions/Base16.js +36 -0
- package/core/types/Extensions/BinaryReader.d.ts +17 -0
- package/core/types/Extensions/BinaryReader.d.ts.map +1 -0
- package/core/types/Extensions/BinaryReader.js +192 -0
- package/core/types/Extensions/BinaryWriter.d.ts +25 -0
- package/core/types/Extensions/BinaryWriter.d.ts.map +1 -0
- package/core/types/Extensions/BinaryWriter.js +191 -0
- package/core/types/Extensions/Describer.d.ts +5 -0
- package/core/types/Extensions/Describer.d.ts.map +1 -0
- package/core/types/Extensions/Describer.js +25 -0
- package/core/types/Extensions/PBinaryReader.d.ts +42 -0
- package/core/types/Extensions/PBinaryReader.d.ts.map +1 -0
- package/core/types/Extensions/PBinaryReader.js +269 -0
- package/core/types/Extensions/PBinaryWriter.d.ts +49 -0
- package/core/types/Extensions/PBinaryWriter.d.ts.map +1 -0
- package/core/types/Extensions/PBinaryWriter.js +250 -0
- package/core/types/Extensions/TableColumns.d.ts +5 -0
- package/core/types/Extensions/TableColumns.d.ts.map +1 -0
- package/core/types/Extensions/TableColumns.js +22 -0
- package/core/types/Extensions/index.d.ts +5 -0
- package/core/types/Extensions/index.d.ts.map +1 -0
- package/core/types/Extensions/index.js +20 -0
- package/core/types/PhantasmaKeys.d.ts +19 -0
- package/core/types/PhantasmaKeys.d.ts.map +1 -0
- package/core/types/PhantasmaKeys.js +92 -0
- package/core/types/Serialization.d.ts +22 -0
- package/core/types/Serialization.d.ts.map +1 -0
- package/core/types/Serialization.js +195 -0
- package/core/types/Stack.d.ts +16 -0
- package/core/types/Stack.d.ts.map +1 -0
- package/core/types/Stack.js +42 -0
- package/core/types/Timestamp.d.ts +26 -0
- package/core/types/Timestamp.d.ts.map +1 -0
- package/core/types/Timestamp.js +74 -0
- package/core/types/index.d.ts +12 -0
- package/core/types/index.d.ts.map +1 -0
- package/core/types/index.js +27 -0
- package/core/utils/index.d.ts +25 -0
- package/core/utils/index.d.ts.map +1 -0
- package/core/utils/index.js +236 -0
- package/core/vm/Contracts.d.ts +17 -0
- package/core/vm/Contracts.d.ts.map +1 -0
- package/core/vm/Contracts.js +20 -0
- package/core/vm/Decoder.d.ts +19 -0
- package/core/vm/Decoder.d.ts.map +1 -0
- package/core/vm/Decoder.js +175 -0
- package/core/vm/EventData.d.ts +97 -0
- package/core/vm/EventData.d.ts.map +1 -0
- package/core/vm/EventData.js +134 -0
- package/core/vm/Opcode.d.ts +57 -0
- package/core/vm/Opcode.d.ts.map +1 -0
- package/core/vm/Opcode.js +69 -0
- package/core/vm/ScriptBuilder.d.ts +65 -0
- package/core/vm/ScriptBuilder.d.ts.map +1 -0
- package/core/vm/ScriptBuilder.js +592 -0
- package/core/vm/VMObject.d.ts +55 -0
- package/core/vm/VMObject.d.ts.map +1 -0
- package/core/vm/VMObject.js +1101 -0
- package/core/vm/VMType.d.ts +12 -0
- package/core/vm/VMType.d.ts.map +1 -0
- package/core/vm/VMType.js +15 -0
- package/core/vm/index.d.ts +8 -0
- package/core/vm/index.d.ts.map +1 -0
- package/core/vm/index.js +23 -0
- package/html/TestWebPage.html +187 -0
- package/html/phantasma.js +60504 -0
- package/index.d.ts +5 -0
- package/index.d.ts.map +1 -0
- package/index.js +36 -0
- package/jest.config.js +5 -0
- package/package.json +67 -0
- package/src/core/index.ts +9 -0
- package/src/core/interfaces/IContract.ts +28 -0
- package/src/core/interfaces/IKeyPair.ts +14 -0
- package/src/core/interfaces/ISerializable.ts +6 -0
- package/src/core/interfaces/IStack.ts +6 -0
- package/src/core/interfaces/IToken.ts +31 -0
- package/src/core/interfaces/Signature.ts +32 -0
- package/src/core/interfaces/index.ts +6 -0
- package/src/core/ledger/Address-Transcode.ts +44 -0
- package/src/core/ledger/Ledger-Commands.ts +463 -0
- package/src/core/ledger/Ledger-Utils.ts +549 -0
- package/src/core/ledger/Mnemonic.ts +79 -0
- package/src/core/ledger/Transaction-Sign.ts +126 -0
- package/src/core/ledger/Transaction-Transcode.ts +56 -0
- package/src/core/ledger/index.ts +8 -0
- package/src/core/ledger/interfaces/ApplicationNameResponse.ts +5 -0
- package/src/core/ledger/interfaces/Device.ts +6 -0
- package/src/core/ledger/interfaces/DeviceResponse.ts +6 -0
- package/src/core/ledger/interfaces/Ledger.ts +10 -0
- package/src/core/ledger/interfaces/LedgerBalanceFromLedgerResponse.ts +9 -0
- package/src/core/ledger/interfaces/LedgerConfig.ts +17 -0
- package/src/core/ledger/interfaces/LedgerDeviceInfoResponse.ts +7 -0
- package/src/core/ledger/interfaces/LedgerSendTransactionResponse.ts +4 -0
- package/src/core/ledger/interfaces/LedgerSigner.ts +6 -0
- package/src/core/ledger/interfaces/LedgerSignerData.ts +8 -0
- package/src/core/ledger/interfaces/PublicKeyResponse.ts +5 -0
- package/src/core/ledger/interfaces/SignResponse.ts +5 -0
- package/src/core/ledger/interfaces/VersionResponse.ts +5 -0
- package/src/core/ledger/interfaces/index.ts +13 -0
- package/src/core/link/easyConnect.ts +214 -0
- package/src/core/link/easyScript.ts +67 -0
- package/src/core/link/index.ts +1 -0
- package/src/core/link/interfaces/IAccount.ts +13 -0
- package/src/core/link/interfaces/IFile.ts +6 -0
- package/src/core/link/interfaces/ProofOfWork.ts +8 -0
- package/src/core/link/interfaces/index.ts +3 -0
- package/src/core/link/phantasmaLink.ts +561 -0
- package/src/core/rpc/index.ts +2 -0
- package/src/core/rpc/interfaces/ABIContract.ts +6 -0
- package/src/core/rpc/interfaces/ABIEvent.ts +6 -0
- package/src/core/rpc/interfaces/ABIMethod.ts +7 -0
- package/src/core/rpc/interfaces/ABIParameter.ts +4 -0
- package/src/core/rpc/interfaces/Account.ts +16 -0
- package/src/core/rpc/interfaces/AccountTransactions.ts +6 -0
- package/src/core/rpc/interfaces/Archive.ts +10 -0
- package/src/core/rpc/interfaces/Auction.ts +12 -0
- package/src/core/rpc/interfaces/Balance.ts +7 -0
- package/src/core/rpc/interfaces/Block.ts +17 -0
- package/src/core/rpc/interfaces/Chain.ts +9 -0
- package/src/core/rpc/interfaces/Channel.ts +12 -0
- package/src/core/rpc/interfaces/Contract.ts +11 -0
- package/src/core/rpc/interfaces/Dapp.ts +5 -0
- package/src/core/rpc/interfaces/Event.ts +6 -0
- package/src/core/rpc/interfaces/Governance.ts +4 -0
- package/src/core/rpc/interfaces/Interop.ts +4 -0
- package/src/core/rpc/interfaces/KeyValue.ts +4 -0
- package/src/core/rpc/interfaces/Leaderboard.ts +6 -0
- package/src/core/rpc/interfaces/LeaderboardRow.ts +4 -0
- package/src/core/rpc/interfaces/NFT.ts +14 -0
- package/src/core/rpc/interfaces/Nexus.ts +14 -0
- package/src/core/rpc/interfaces/Oracle.ts +4 -0
- package/src/core/rpc/interfaces/Organization.ts +5 -0
- package/src/core/rpc/interfaces/Paginated.ts +7 -0
- package/src/core/rpc/interfaces/Peer.ts +7 -0
- package/src/core/rpc/interfaces/Platform.ts +9 -0
- package/src/core/rpc/interfaces/Receipt.ts +9 -0
- package/src/core/rpc/interfaces/Script.ts +9 -0
- package/src/core/rpc/interfaces/SendRawTx.ts +4 -0
- package/src/core/rpc/interfaces/SignatureResult.ts +4 -0
- package/src/core/rpc/interfaces/Stake.ts +5 -0
- package/src/core/rpc/interfaces/Storage.ts +8 -0
- package/src/core/rpc/interfaces/Swap.ts +12 -0
- package/src/core/rpc/interfaces/Token.ts +19 -0
- package/src/core/rpc/interfaces/TokenData.ts +12 -0
- package/src/core/rpc/interfaces/TokenExternal.ts +4 -0
- package/src/core/rpc/interfaces/TokenPrice.ts +7 -0
- package/src/core/rpc/interfaces/TokenSeries.ts +12 -0
- package/src/core/rpc/interfaces/TransactionData.ts +23 -0
- package/src/core/rpc/interfaces/Validator.ts +4 -0
- package/src/core/rpc/interfaces/index.ts +41 -0
- package/src/core/rpc/phantasma.ts +466 -0
- package/src/core/tx/Transaction.ts +258 -0
- package/src/core/tx/index.ts +2 -0
- package/src/core/tx/utils.ts +106 -0
- package/src/core/types/Address.ts +290 -0
- package/src/core/types/Consensus.ts +181 -0
- package/src/core/types/Contract.ts +324 -0
- package/src/core/types/DomainSettings.ts +128 -0
- package/src/core/types/Ed25519Signature.ts +78 -0
- package/src/core/types/Entropy.ts +16 -0
- package/src/core/types/Extensions/Base16.ts +36 -0
- package/src/core/types/Extensions/Describer.ts +17 -0
- package/src/core/types/Extensions/PBinaryReader.ts +247 -0
- package/src/core/types/Extensions/PBinaryWriter.ts +278 -0
- package/src/core/types/Extensions/index.ts +4 -0
- package/src/core/types/PhantasmaKeys.ts +119 -0
- package/src/core/types/Serialization.ts +211 -0
- package/src/core/types/Stack.ts +46 -0
- package/src/core/types/Timestamp.ts +93 -0
- package/src/core/types/index.ts +11 -0
- package/src/core/utils/index.ts +206 -0
- package/src/core/vm/Contracts.ts +17 -0
- package/src/core/vm/Decoder.ts +162 -0
- package/src/core/vm/Disassembler.ts +1 -0
- package/src/core/vm/EventData.ts +135 -0
- package/src/core/vm/Opcode.ts +74 -0
- package/src/core/vm/ScriptBuilder.ts +588 -0
- package/src/core/vm/VMObject.ts +1162 -0
- package/src/core/vm/VMType.ts +11 -0
- package/src/core/vm/index.ts +7 -0
- package/src/core/vm/utils/DisasmMethodCall.ts +22 -0
- package/src/core/vm/utils/DisasmUtils.ts +89 -0
- package/src/core/vm/utils/index.ts +2 -0
- package/src/index.ts +7 -0
- package/tests/VMObject.test.ts +146 -0
- package/tests/ledger/Address-Transacode.test.ts +26 -0
- package/tests/tx/Transaction.test.ts +274 -0
- package/tests/types/Address.test.ts +26 -0
- package/tests/types/Consensus.test.ts +67 -0
- package/tsconfig.json +29 -0
|
@@ -0,0 +1,1162 @@
|
|
|
1
|
+
import BigInteger from "big-integer";
|
|
2
|
+
import { VMType } from "./VMType";
|
|
3
|
+
import { Timestamp } from "../types/Timestamp";
|
|
4
|
+
import {
|
|
5
|
+
Address,
|
|
6
|
+
Base16,
|
|
7
|
+
Describer,
|
|
8
|
+
PBinaryReader,
|
|
9
|
+
PBinaryWriter,
|
|
10
|
+
Serialization,
|
|
11
|
+
} from "../types";
|
|
12
|
+
import { ISerializable } from "../interfaces";
|
|
13
|
+
import {
|
|
14
|
+
uint8ArrayToBytes,
|
|
15
|
+
uint8ArrayToHex,
|
|
16
|
+
uint8ArrayToString,
|
|
17
|
+
uint8ArrayToStringDefault,
|
|
18
|
+
} from "../utils";
|
|
19
|
+
import { Type } from "typescript";
|
|
20
|
+
import bigInt from "big-integer";
|
|
21
|
+
|
|
22
|
+
export class VMObject implements ISerializable {
|
|
23
|
+
public Type: VMType;
|
|
24
|
+
public Data: object | null | undefined;
|
|
25
|
+
public get IsEmpty(): boolean {
|
|
26
|
+
return this.Data == null || this.Data == undefined;
|
|
27
|
+
}
|
|
28
|
+
private _localSize = 0;
|
|
29
|
+
private static readonly TimeFormat: string = "MM/dd/yyyy HH:mm:ss";
|
|
30
|
+
|
|
31
|
+
public GetChildren(): Map<VMObject, VMObject> | null {
|
|
32
|
+
return this.Type == VMType.Struct
|
|
33
|
+
? (this.Data as Map<VMObject, VMObject>)
|
|
34
|
+
: null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public get Size(): number {
|
|
38
|
+
let total = 0;
|
|
39
|
+
|
|
40
|
+
if (this.Type == VMType.Object) {
|
|
41
|
+
const children = this.GetChildren();
|
|
42
|
+
let values = children?.values;
|
|
43
|
+
for (let entry in values) {
|
|
44
|
+
total += entry.length;
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
total = this._localSize;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return total;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
constructor() {
|
|
54
|
+
this.Type = VMType.None;
|
|
55
|
+
this.Data = null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public AsTimestamp(): Timestamp {
|
|
59
|
+
if (this.Type != VMType.Timestamp) {
|
|
60
|
+
throw new Error(`Invalid cast: expected timestamp, got ${this.Type}`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return this.Data as Timestamp;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public AsByteArray(): Uint8Array {
|
|
67
|
+
switch (this.Type) {
|
|
68
|
+
case VMType.Bytes:
|
|
69
|
+
return this.Data as Uint8Array;
|
|
70
|
+
case VMType.Bool:
|
|
71
|
+
return new Uint8Array([(this.Data as unknown as boolean) ? 1 : 0]);
|
|
72
|
+
case VMType.String:
|
|
73
|
+
return new TextEncoder().encode(this.AsString() as string);
|
|
74
|
+
case VMType.Number:
|
|
75
|
+
// Here you will have to convert BigInteger to Uint8Array manually
|
|
76
|
+
case VMType.Enum:
|
|
77
|
+
var num = this.AsNumber() as unknown as number;
|
|
78
|
+
var bytes = new Uint8Array(new ArrayBuffer(4));
|
|
79
|
+
new DataView(bytes.buffer).setUint32(0, num);
|
|
80
|
+
return bytes;
|
|
81
|
+
case VMType.Timestamp:
|
|
82
|
+
var time = this.AsTimestamp();
|
|
83
|
+
var bytes = new Uint8Array(new ArrayBuffer(4));
|
|
84
|
+
new DataView(bytes.buffer).setUint32(0, time.value);
|
|
85
|
+
return bytes;
|
|
86
|
+
case VMType.Struct:
|
|
87
|
+
// Here you will have to convert struct to Uint8Array manually
|
|
88
|
+
case VMType.Object:
|
|
89
|
+
// here you will have to convert ISerializable to Uint8Array manually
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Invalid cast: expected bytes, got ${this.Type}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public AsString(): string {
|
|
96
|
+
switch (this.Type) {
|
|
97
|
+
case VMType.String:
|
|
98
|
+
return this.Data?.toString() as string;
|
|
99
|
+
case VMType.Number:
|
|
100
|
+
return (this.Data as BigInteger).toString();
|
|
101
|
+
case VMType.Bytes:
|
|
102
|
+
return uint8ArrayToStringDefault(this.Data as Uint8Array);
|
|
103
|
+
case VMType.Enum:
|
|
104
|
+
return (this.Data as unknown as number).toString();
|
|
105
|
+
case VMType.Object:
|
|
106
|
+
if (this.Data instanceof Address) {
|
|
107
|
+
return this.Data.Text;
|
|
108
|
+
}
|
|
109
|
+
/*if (this.Data instanceof Hash) {
|
|
110
|
+
return this.Data.toString();
|
|
111
|
+
}*/
|
|
112
|
+
return "Interop:" + this.Data?.constructor.name;
|
|
113
|
+
case VMType.Struct:
|
|
114
|
+
const arrayType = this.GetArrayType();
|
|
115
|
+
if (arrayType === VMType.Number) {
|
|
116
|
+
// convert array of unicode numbers into a string
|
|
117
|
+
const children = this.GetChildren();
|
|
118
|
+
let sb = "";
|
|
119
|
+
|
|
120
|
+
for (let i = 0; i < children!.size; i++) {
|
|
121
|
+
const key = VMObject.FromObject(i);
|
|
122
|
+
const val = children?.get(key);
|
|
123
|
+
|
|
124
|
+
const ch = String.fromCharCode(
|
|
125
|
+
val!.AsNumber() as unknown as number
|
|
126
|
+
);
|
|
127
|
+
sb += ch;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return sb;
|
|
131
|
+
} else {
|
|
132
|
+
/*const buffer = new ArrayBuffer(this.Data?.length as number);
|
|
133
|
+
const view = new DataView(buffer);
|
|
134
|
+
this.SerializeData(view);
|
|
135
|
+
return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)));*/
|
|
136
|
+
}
|
|
137
|
+
case VMType.Bool:
|
|
138
|
+
return this.Data ? "true" : "false";
|
|
139
|
+
case VMType.Timestamp:
|
|
140
|
+
return (this.Data as Timestamp).value.toString();
|
|
141
|
+
default:
|
|
142
|
+
throw new Error(`Invalid cast: expected string, got ${this.Type}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public ToString(): string {
|
|
147
|
+
switch (this.Type) {
|
|
148
|
+
case VMType.String:
|
|
149
|
+
return this.Data as unknown as string;
|
|
150
|
+
case VMType.Number:
|
|
151
|
+
return (this.Data as BigInteger).toString();
|
|
152
|
+
case VMType.Bytes:
|
|
153
|
+
return new TextDecoder().decode(this.Data as Uint8Array);
|
|
154
|
+
case VMType.Enum:
|
|
155
|
+
return (this.Data as unknown as number).toString();
|
|
156
|
+
case VMType.Object:
|
|
157
|
+
if (this.Data instanceof Address) {
|
|
158
|
+
return this.Data.Text;
|
|
159
|
+
}
|
|
160
|
+
/*if (this.Data instanceof Hash) {
|
|
161
|
+
return this.Data.toString();
|
|
162
|
+
}*/
|
|
163
|
+
return "Interop:" + (this.Data as object).constructor.name;
|
|
164
|
+
case VMType.Struct:
|
|
165
|
+
const arrayType = this.GetArrayType();
|
|
166
|
+
if (arrayType === VMType.Number) {
|
|
167
|
+
// convert array of unicode numbers into a string
|
|
168
|
+
const children = this.GetChildren();
|
|
169
|
+
let sb = "";
|
|
170
|
+
for (let i = 0; i < children!.size; i++) {
|
|
171
|
+
const key = VMObject.FromObject(i);
|
|
172
|
+
const val = children!.get(key);
|
|
173
|
+
const ch = String.fromCharCode(
|
|
174
|
+
val!.AsNumber() as unknown as number
|
|
175
|
+
);
|
|
176
|
+
sb += ch;
|
|
177
|
+
}
|
|
178
|
+
return sb;
|
|
179
|
+
} else {
|
|
180
|
+
/*const stream = new PMemoryStream();
|
|
181
|
+
const writer = new PBinaryWriter(stream);
|
|
182
|
+
this.SerializeData(writer);
|
|
183
|
+
return new TextDecoder().decode(stream.toArray());*/
|
|
184
|
+
}
|
|
185
|
+
case VMType.Bool:
|
|
186
|
+
return this.Data ? "true" : "false";
|
|
187
|
+
case VMType.Timestamp:
|
|
188
|
+
return (this.Data as Timestamp).value.toString();
|
|
189
|
+
default:
|
|
190
|
+
throw new Error(`Invalid cast: expected string, got ${this.Type}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public AsNumber(): number {
|
|
195
|
+
if (
|
|
196
|
+
(this.Type === VMType.Object || this.Type === VMType.Timestamp) &&
|
|
197
|
+
this.Data instanceof Timestamp
|
|
198
|
+
) {
|
|
199
|
+
return (this.Data as Timestamp).value as unknown as number;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
switch (this.Type) {
|
|
203
|
+
case VMType.String: {
|
|
204
|
+
let number: Number = Number(this.Data);
|
|
205
|
+
if (number.toString() === (this.Data as unknown as string)) {
|
|
206
|
+
return number as unknown as number;
|
|
207
|
+
} else {
|
|
208
|
+
throw new Error(
|
|
209
|
+
`Cannot convert String '${this.Data}' to BigInteger.`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
case VMType.Bytes: {
|
|
215
|
+
const bytes = new Uint8Array(this.Data as ArrayBuffer);
|
|
216
|
+
const num = BigInt(`0x${bytes.join("")}`);
|
|
217
|
+
return num as unknown as number;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
case VMType.Enum: {
|
|
221
|
+
const num = Number(this.Data);
|
|
222
|
+
return BigInt(num) as unknown as number;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
case VMType.Bool: {
|
|
226
|
+
const val = this.Data as unknown as boolean;
|
|
227
|
+
return val ? 1 : 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
default: {
|
|
231
|
+
if (this.Type !== VMType.Number) {
|
|
232
|
+
throw new Error(`Invalid cast: expected number, got ${this.Type}`);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return Number(this.Data);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
public AsEnum<T extends any>(): T {
|
|
241
|
+
if (!VMObject.isEnum(this.Data as any)) {
|
|
242
|
+
throw new Error("T must be an enumerated type");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (this.Type !== VMType.Enum) {
|
|
246
|
+
this.Data = new Number(this.AsNumber());
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return this.Data as any as T;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public GetArrayType(): VMType {
|
|
253
|
+
if (this.Type !== VMType.Struct) {
|
|
254
|
+
return VMType.None;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const children = this.GetChildren();
|
|
258
|
+
|
|
259
|
+
let result: VMType = VMType.None;
|
|
260
|
+
|
|
261
|
+
for (let i = 0; i < children!.size; i++) {
|
|
262
|
+
const key = VMObject.FromObject(i);
|
|
263
|
+
|
|
264
|
+
if (!children!.has(key)) {
|
|
265
|
+
return VMType.None;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const val = children!.get(key);
|
|
269
|
+
|
|
270
|
+
if (result === VMType.None) {
|
|
271
|
+
result = val!.Type;
|
|
272
|
+
} else if (val!.Type !== result) {
|
|
273
|
+
return VMType.None;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return result;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
public AsType(type: VMType): any {
|
|
281
|
+
switch (type) {
|
|
282
|
+
case VMType.Bool:
|
|
283
|
+
return this.AsBool();
|
|
284
|
+
case VMType.String:
|
|
285
|
+
return this.AsString();
|
|
286
|
+
case VMType.Bytes:
|
|
287
|
+
return this.AsByteArray();
|
|
288
|
+
case VMType.Number:
|
|
289
|
+
return this.AsNumber();
|
|
290
|
+
case VMType.Timestamp:
|
|
291
|
+
return this.AsTimestamp();
|
|
292
|
+
default:
|
|
293
|
+
throw "Unsupported VM cast";
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
static isEnum(instance: any): boolean {
|
|
298
|
+
if (instance == null) return false;
|
|
299
|
+
let keys = Object.keys(instance);
|
|
300
|
+
let values: any[] = [];
|
|
301
|
+
|
|
302
|
+
for (let key of keys) {
|
|
303
|
+
let value = instance[key];
|
|
304
|
+
|
|
305
|
+
if (typeof value === "number") {
|
|
306
|
+
value = value.toString();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
values.push(value);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
for (let key of keys) {
|
|
313
|
+
if (values.indexOf(key) < 0) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/*public AsEnum<T>(): T {
|
|
322
|
+
if (isEnum(this.Data)) {
|
|
323
|
+
throw new ArgumentException("T must be an enumerated type");
|
|
324
|
+
}
|
|
325
|
+
if (this.Type != VMType.Enum) {
|
|
326
|
+
const num = this.AsNumber();
|
|
327
|
+
this.Data = Number(this.Data);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return (T) Enum.Parse(typeof T, this.Data.toString());
|
|
331
|
+
}*/
|
|
332
|
+
|
|
333
|
+
public AsBool(): boolean {
|
|
334
|
+
switch (this.Type) {
|
|
335
|
+
case VMType.String:
|
|
336
|
+
return (this.Data as unknown as string).toLowerCase() == "true";
|
|
337
|
+
case VMType.Number:
|
|
338
|
+
return (this.Data as BigInt) != BigInt(0);
|
|
339
|
+
case VMType.Bool:
|
|
340
|
+
return (this.Data as unknown as boolean) ? true : false;
|
|
341
|
+
default:
|
|
342
|
+
throw new Error(`Invalid cast: expected bool, got ${this.Type}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
public static isStructOrClass(type: Type): boolean {
|
|
347
|
+
return (
|
|
348
|
+
(!VMObject.isPrimitive(type) &&
|
|
349
|
+
VMObject.isValueType(type) &&
|
|
350
|
+
!VMObject.isEnum(type)) ||
|
|
351
|
+
VMObject.isClass(type) ||
|
|
352
|
+
VMObject.isInterface(type)
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
public static isSerializable(type: any): boolean {
|
|
357
|
+
return (
|
|
358
|
+
type instanceof ISerializable ||
|
|
359
|
+
VMObject.isPrimitive(type) ||
|
|
360
|
+
VMObject.isStructOrClass(type) ||
|
|
361
|
+
VMObject.isEnum(type)
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
public static isPrimitive(type: any): boolean {
|
|
366
|
+
return (
|
|
367
|
+
type === String || type === Number || type === Boolean || type === BigInt
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
public static isValueType(type: any): boolean {
|
|
372
|
+
return type === Object;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
public static isClass(type: any): boolean {
|
|
376
|
+
return (
|
|
377
|
+
type === Array ||
|
|
378
|
+
type === Map ||
|
|
379
|
+
type === Set ||
|
|
380
|
+
type instanceof Object ||
|
|
381
|
+
(typeof type).toLowerCase() === "object"
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
public static isInterface(type: any): boolean {
|
|
386
|
+
return type === Map;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
private static ConvertObjectInternal(fieldValue: any, fieldType: any): any {
|
|
390
|
+
if (
|
|
391
|
+
(VMObject.isStructOrClass(fieldType) &&
|
|
392
|
+
fieldValue instanceof Uint8Array) ||
|
|
393
|
+
fieldValue instanceof Array
|
|
394
|
+
) {
|
|
395
|
+
const bytes = fieldValue as Uint8Array;
|
|
396
|
+
fieldValue = Serialization.Unserialize<typeof fieldType>(
|
|
397
|
+
bytes,
|
|
398
|
+
typeof fieldType
|
|
399
|
+
);
|
|
400
|
+
} else if (VMObject.isEnum(fieldType)) {
|
|
401
|
+
let tempValue: typeof fieldType = fieldValue as keyof typeof fieldType;
|
|
402
|
+
fieldValue = tempValue;
|
|
403
|
+
}
|
|
404
|
+
return fieldValue;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
public ToArray(arrayElementType: any): any[] {
|
|
408
|
+
if (this.Type !== VMType.Struct) {
|
|
409
|
+
throw new Error("not a valid source struct");
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const children = this.GetChildren();
|
|
413
|
+
let maxIndex = -1;
|
|
414
|
+
for (const child of children) {
|
|
415
|
+
if (child[0].Type !== VMType.Number) {
|
|
416
|
+
throw new Error("source contains an element with invalid array index");
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const temp = child[0].AsNumber();
|
|
420
|
+
// TODO use a constant for VM max array size
|
|
421
|
+
if (temp >= 1024) {
|
|
422
|
+
throw new Error(
|
|
423
|
+
"source contains an element with a very large array index"
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const index = Math.floor(temp);
|
|
428
|
+
if (index < 0) {
|
|
429
|
+
throw new Error("source contains an array index with negative value");
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
maxIndex = Math.max(index, maxIndex);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const length = maxIndex + 1;
|
|
436
|
+
const array: any[] = new Array(length);
|
|
437
|
+
|
|
438
|
+
for (const child of children) {
|
|
439
|
+
const temp = child[0].AsNumber();
|
|
440
|
+
const index = Math.floor(temp);
|
|
441
|
+
|
|
442
|
+
let val = child[1].ToObjectType(arrayElementType);
|
|
443
|
+
|
|
444
|
+
val = VMObject.ConvertObjectInternal(val, arrayElementType);
|
|
445
|
+
|
|
446
|
+
array[index] = val;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
return array;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
public ToObjectType(type: any): any {
|
|
453
|
+
if (this.Type === VMType.Struct) {
|
|
454
|
+
if (Array.isArray(type)) {
|
|
455
|
+
const elementType = typeof type;
|
|
456
|
+
return this.ToArray(elementType);
|
|
457
|
+
} else if (VMObject.isStructOrClass(type)) {
|
|
458
|
+
return this.ToStruct(type);
|
|
459
|
+
} else {
|
|
460
|
+
throw new Error("some stuff still missing: eg: lists, dictionaries..");
|
|
461
|
+
}
|
|
462
|
+
} else {
|
|
463
|
+
const temp = this.ToObject();
|
|
464
|
+
return temp;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
public ToObject(): any {
|
|
469
|
+
if (this.Type === VMType.None) {
|
|
470
|
+
throw new Error("not a valid object");
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
switch (this.Type) {
|
|
474
|
+
case VMType.Bool:
|
|
475
|
+
return this.AsBool();
|
|
476
|
+
case VMType.Bytes:
|
|
477
|
+
return this.AsByteArray();
|
|
478
|
+
case VMType.String:
|
|
479
|
+
return this.AsString();
|
|
480
|
+
case VMType.Number:
|
|
481
|
+
return this.AsNumber();
|
|
482
|
+
case VMType.Timestamp:
|
|
483
|
+
return this.AsTimestamp();
|
|
484
|
+
case VMType.Object:
|
|
485
|
+
return this.Data;
|
|
486
|
+
case VMType.Enum:
|
|
487
|
+
return this.Data;
|
|
488
|
+
case VMType.Struct:
|
|
489
|
+
let objs = this.GetChildren();
|
|
490
|
+
|
|
491
|
+
let result = [];
|
|
492
|
+
for (let obj of objs) {
|
|
493
|
+
result.push(obj[1].ToObject());
|
|
494
|
+
}
|
|
495
|
+
return result;
|
|
496
|
+
|
|
497
|
+
default:
|
|
498
|
+
throw new Error(`Cannot cast ${this.Type} to object`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
public ToStruct<T>(structType: any): T {
|
|
503
|
+
if (this.Type !== VMType.Struct) {
|
|
504
|
+
throw new Error("not a valid source struct");
|
|
505
|
+
}
|
|
506
|
+
if (!VMObject.isStructOrClass(structType)) {
|
|
507
|
+
throw new Error("not a valid destination struct");
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
//let localType = Object.apply(typeof structType);
|
|
511
|
+
let localType; //: typeof type;
|
|
512
|
+
|
|
513
|
+
if (structType.name != undefined) {
|
|
514
|
+
let className = structType.name;
|
|
515
|
+
localType = Object.apply(className);
|
|
516
|
+
} else {
|
|
517
|
+
localType = new structType();
|
|
518
|
+
}
|
|
519
|
+
const dict = this.GetChildren();
|
|
520
|
+
const dictKeys = this.GetChildren().keys();
|
|
521
|
+
const result = new structType();
|
|
522
|
+
const fields = Object.keys(typeof localType);
|
|
523
|
+
let fields2 = Describer.describe(structType, false);
|
|
524
|
+
|
|
525
|
+
//console.log("fields", keyof typeof structType);
|
|
526
|
+
fields2 = fields2.map((x) => x.replace("this.", ""));
|
|
527
|
+
for (let field of fields2) {
|
|
528
|
+
field.replace("this.", "");
|
|
529
|
+
const key = VMObject.FromObject(field);
|
|
530
|
+
//const key = field;
|
|
531
|
+
const dictKey = dictKeys.next().value;
|
|
532
|
+
let val;
|
|
533
|
+
if (dictKey?.Data.toString() == key.Data.toString()) {
|
|
534
|
+
let localValue = dict.get(dictKey);
|
|
535
|
+
|
|
536
|
+
if (localValue.GetChildren() != undefined) {
|
|
537
|
+
result[field] = localValue.ToArray(typeof localType[field]);
|
|
538
|
+
continue;
|
|
539
|
+
} else {
|
|
540
|
+
val = localValue.ToObject();
|
|
541
|
+
}
|
|
542
|
+
//val = Serialization.Unserialize(dict.get(dictKey));
|
|
543
|
+
} else {
|
|
544
|
+
if (!VMObject.isStructOrClass(structType[field])) {
|
|
545
|
+
//console.log(`field not present in source struct: ${field}`);
|
|
546
|
+
//throw new Error(`field not present in source struct: ${field}`);
|
|
547
|
+
}
|
|
548
|
+
//val = null;
|
|
549
|
+
}
|
|
550
|
+
/*if (val !== null && localType[field] !== "Uint8Array") {
|
|
551
|
+
if (VMObject.isSerializable(localType[field])) {
|
|
552
|
+
const temp = new structType[field]();
|
|
553
|
+
const stream = new Uint8Array(val);
|
|
554
|
+
const reader = new PBinaryReader(stream);
|
|
555
|
+
(temp as ISerializable).UnserializeData(reader);
|
|
556
|
+
val = temp;
|
|
557
|
+
}
|
|
558
|
+
}*/
|
|
559
|
+
|
|
560
|
+
if (VMObject.isEnum(typeof structType[field]) && !VMObject.isEnum(val)) {
|
|
561
|
+
val = localType[field][val?.toString()];
|
|
562
|
+
}
|
|
563
|
+
result[field] = val;
|
|
564
|
+
}
|
|
565
|
+
return result;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
public static GetVMType(type: any): any {
|
|
569
|
+
if (VMObject.isEnum(type)) {
|
|
570
|
+
return VMType.Enum;
|
|
571
|
+
}
|
|
572
|
+
if (type === Boolean || type.toLowerCase() === "boolean") {
|
|
573
|
+
return VMType.Bool;
|
|
574
|
+
}
|
|
575
|
+
if (
|
|
576
|
+
typeof type == typeof String ||
|
|
577
|
+
type === String ||
|
|
578
|
+
type.toLowerCase() === "string"
|
|
579
|
+
) {
|
|
580
|
+
return VMType.String;
|
|
581
|
+
}
|
|
582
|
+
if (
|
|
583
|
+
typeof type === typeof Uint8Array ||
|
|
584
|
+
type === Uint8Array ||
|
|
585
|
+
type.toLowerCase() === "uint8array"
|
|
586
|
+
) {
|
|
587
|
+
return VMType.Bytes;
|
|
588
|
+
}
|
|
589
|
+
if (
|
|
590
|
+
type === "BigInt" ||
|
|
591
|
+
type === Number ||
|
|
592
|
+
type === BigInt ||
|
|
593
|
+
type.toLowerCase() === "number"
|
|
594
|
+
) {
|
|
595
|
+
return VMType.Number;
|
|
596
|
+
}
|
|
597
|
+
if (type === Timestamp || type === Number) {
|
|
598
|
+
return VMType.Timestamp;
|
|
599
|
+
}
|
|
600
|
+
if (VMObject.isEnum(type)) {
|
|
601
|
+
return VMType.Enum;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
if (Array.isArray(type)) {
|
|
605
|
+
return VMType.Struct;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
if (VMObject.isClass(type) || VMObject.isValueType(type)) {
|
|
609
|
+
return VMType.Object;
|
|
610
|
+
}
|
|
611
|
+
return VMType.Struct;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
public static IsVMType(type: any): boolean {
|
|
615
|
+
const result = VMObject.GetVMType(type);
|
|
616
|
+
return result !== VMType.None;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
public SetValue(value: any): VMObject {
|
|
620
|
+
this.Data = value;
|
|
621
|
+
return this;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
public setValue(val: any, type: VMType) {
|
|
625
|
+
this.Type = type;
|
|
626
|
+
this._localSize = val != null ? val.length : 0;
|
|
627
|
+
|
|
628
|
+
switch (type) {
|
|
629
|
+
case VMType.Bytes:
|
|
630
|
+
this.Data = val;
|
|
631
|
+
break;
|
|
632
|
+
case VMType.Number:
|
|
633
|
+
this.Data = val == null ? BigInt(0) : val;
|
|
634
|
+
break;
|
|
635
|
+
case VMType.String:
|
|
636
|
+
this.Data = new String(val);
|
|
637
|
+
break;
|
|
638
|
+
case VMType.Enum:
|
|
639
|
+
this.Data = val;
|
|
640
|
+
break;
|
|
641
|
+
case VMType.Timestamp:
|
|
642
|
+
this.Data = new Timestamp(val.slice(0, 4));
|
|
643
|
+
break;
|
|
644
|
+
case VMType.Bool:
|
|
645
|
+
this.Data = new Boolean(val[0] === 1);
|
|
646
|
+
break;
|
|
647
|
+
default:
|
|
648
|
+
if (val instanceof Uint8Array) {
|
|
649
|
+
const len = val.length;
|
|
650
|
+
switch (len) {
|
|
651
|
+
case Address.LengthInBytes:
|
|
652
|
+
this.Data = Address.FromBytes(val);
|
|
653
|
+
break;
|
|
654
|
+
/*case Hash.Length:
|
|
655
|
+
this.Data = Hash.fromBytes(val);
|
|
656
|
+
break;*/
|
|
657
|
+
/*default:
|
|
658
|
+
try {
|
|
659
|
+
this.unserializeData(val);
|
|
660
|
+
} catch (e) {
|
|
661
|
+
throw new Error("Cannot decode interop object from bytes with length: " + len);
|
|
662
|
+
}
|
|
663
|
+
break;*/
|
|
664
|
+
}
|
|
665
|
+
break;
|
|
666
|
+
} else {
|
|
667
|
+
throw new Error("Cannot set value for vmtype: " + type);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
public static ValidateStructKey(key: VMObject) {
|
|
673
|
+
if (
|
|
674
|
+
key.Type == VMType.None ||
|
|
675
|
+
key.Type == VMType.Struct ||
|
|
676
|
+
key.Type == VMType.Object
|
|
677
|
+
) {
|
|
678
|
+
throw new Error(
|
|
679
|
+
`Cannot use value of type ${key.Type} as key for struct field`
|
|
680
|
+
);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
public CastViaReflection(
|
|
685
|
+
srcObj: any,
|
|
686
|
+
level: number,
|
|
687
|
+
dontConvertSerializables: boolean = true
|
|
688
|
+
): any {
|
|
689
|
+
const srcType = srcObj.constructor.name;
|
|
690
|
+
if (Array.isArray(srcObj)) {
|
|
691
|
+
const children = new Map<any, any>();
|
|
692
|
+
const array = srcObj;
|
|
693
|
+
for (let i = 0; i < array.length; i++) {
|
|
694
|
+
const val = array[i];
|
|
695
|
+
const key = new VMObject();
|
|
696
|
+
key.SetValue(i);
|
|
697
|
+
const vmVal = this.CastViaReflection(val, level + 1);
|
|
698
|
+
children.set(key, vmVal);
|
|
699
|
+
}
|
|
700
|
+
const result = new VMObject();
|
|
701
|
+
result.SetValue(children);
|
|
702
|
+
return result;
|
|
703
|
+
} else {
|
|
704
|
+
const targetType = VMObject.GetVMType(srcType);
|
|
705
|
+
|
|
706
|
+
let result: any;
|
|
707
|
+
let isKnownType =
|
|
708
|
+
srcType === VMType.Number || srcType === VMType.Timestamp;
|
|
709
|
+
|
|
710
|
+
let localType = Object.apply(typeof srcType);
|
|
711
|
+
|
|
712
|
+
if (
|
|
713
|
+
!isKnownType &&
|
|
714
|
+
dontConvertSerializables &&
|
|
715
|
+
VMObject.isSerializable(localType)
|
|
716
|
+
) {
|
|
717
|
+
isKnownType = true;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
if (VMObject.isStructOrClass(localType) && !isKnownType) {
|
|
721
|
+
const children = new Map<any, any>();
|
|
722
|
+
const fields = Object.keys(srcObj as typeof srcType);
|
|
723
|
+
if (fields.length > 0) {
|
|
724
|
+
fields.forEach((field: any) => {
|
|
725
|
+
const key = VMObject.FromObject(field);
|
|
726
|
+
VMObject.ValidateStructKey(key);
|
|
727
|
+
const val = srcObj[field];
|
|
728
|
+
const vmVal = this.CastViaReflection(val, level + 1, true);
|
|
729
|
+
children.set(key, vmVal);
|
|
730
|
+
});
|
|
731
|
+
result = new VMObject();
|
|
732
|
+
result.SetValue(children);
|
|
733
|
+
result.Type = VMType.Struct;
|
|
734
|
+
return result;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
result = VMObject.FromObject(srcObj);
|
|
739
|
+
if (result != null) {
|
|
740
|
+
return result;
|
|
741
|
+
}
|
|
742
|
+
throw new Error(`invalid cast: Interop.${srcType} to vm object`);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
SetKey(key: VMObject, obj: VMObject) {
|
|
747
|
+
VMObject.ValidateStructKey(key);
|
|
748
|
+
let children: Map<VMObject, VMObject> | null;
|
|
749
|
+
const temp = new VMObject();
|
|
750
|
+
temp.Copy(key);
|
|
751
|
+
key = temp;
|
|
752
|
+
|
|
753
|
+
if (this.Type == VMType.Struct) {
|
|
754
|
+
children = this.GetChildren();
|
|
755
|
+
} else if (this.Type == VMType.None) {
|
|
756
|
+
this.Type = VMType.Struct;
|
|
757
|
+
children = new Map();
|
|
758
|
+
this.Data = children;
|
|
759
|
+
this._localSize = 0;
|
|
760
|
+
} else {
|
|
761
|
+
throw new Error(`Invalid cast from ${this.Type} to struct`);
|
|
762
|
+
}
|
|
763
|
+
const result = new VMObject();
|
|
764
|
+
children?.set(key, result);
|
|
765
|
+
result.Copy(obj);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
Copy(other: VMObject) {
|
|
769
|
+
if (!other || other.Type == VMType.None) {
|
|
770
|
+
this.Type = VMType.None;
|
|
771
|
+
this.Data = null;
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
this.Type = other.Type;
|
|
775
|
+
if (other.Type == VMType.Struct) {
|
|
776
|
+
const children = new Map<VMObject, VMObject>();
|
|
777
|
+
const otherChildren = other.GetChildren();
|
|
778
|
+
otherChildren?.forEach((val: VMObject, key: VMObject) => {
|
|
779
|
+
const temp = new VMObject();
|
|
780
|
+
temp.Copy(val);
|
|
781
|
+
children.set(key, temp);
|
|
782
|
+
});
|
|
783
|
+
this.Data = children;
|
|
784
|
+
} else {
|
|
785
|
+
this.Data = other.Data;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
public SetType(type: VMType) {
|
|
790
|
+
this.Type = type;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
public static FromArray(array: Array<any>): VMObject {
|
|
794
|
+
const result = new VMObject();
|
|
795
|
+
for (let i = 0; i < array.length; i++) {
|
|
796
|
+
const key = VMObject.FromObject(i);
|
|
797
|
+
const val = VMObject.FromObject(array[i]);
|
|
798
|
+
result.SetKey(key, val);
|
|
799
|
+
}
|
|
800
|
+
return result;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
static CastTo(srcObj: VMObject, type: VMType): VMObject {
|
|
804
|
+
if (srcObj.Type == type) {
|
|
805
|
+
let result = new VMObject();
|
|
806
|
+
result.Copy(srcObj);
|
|
807
|
+
return result;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
switch (type) {
|
|
811
|
+
case VMType.None:
|
|
812
|
+
return new VMObject();
|
|
813
|
+
|
|
814
|
+
case VMType.String: {
|
|
815
|
+
let result = new VMObject();
|
|
816
|
+
result.SetValue(srcObj.AsString());
|
|
817
|
+
return result;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
case VMType.Timestamp: {
|
|
821
|
+
let result = new VMObject();
|
|
822
|
+
result.SetValue(srcObj.AsTimestamp());
|
|
823
|
+
return result;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
case VMType.Bool: {
|
|
827
|
+
let result = new VMObject();
|
|
828
|
+
result.SetValue(srcObj.AsBool());
|
|
829
|
+
return result;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
case VMType.Bytes: {
|
|
833
|
+
let result = new VMObject();
|
|
834
|
+
result.SetValue(srcObj.AsByteArray());
|
|
835
|
+
return result;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
case VMType.Number: {
|
|
839
|
+
let result = new VMObject();
|
|
840
|
+
result.SetValue(srcObj.AsNumber());
|
|
841
|
+
return result;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
case VMType.Struct: {
|
|
845
|
+
switch (srcObj.Type) {
|
|
846
|
+
case VMType.Enum: {
|
|
847
|
+
var result = new VMObject();
|
|
848
|
+
result.SetValue(srcObj.AsEnum()); // TODO does this work for all types?
|
|
849
|
+
return result;
|
|
850
|
+
}
|
|
851
|
+
case VMType.Object: {
|
|
852
|
+
var result = new VMObject();
|
|
853
|
+
result.SetValue(srcObj.CastViaReflection(srcObj.Data, 0)); // TODO does this work for all types?
|
|
854
|
+
return result;
|
|
855
|
+
}
|
|
856
|
+
default:
|
|
857
|
+
throw `invalid cast: ${srcObj.Type} to ${type}`;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
default:
|
|
861
|
+
throw `invalid cast: ${srcObj.Type} to ${type}`;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
public static FromObject(obj: any): any {
|
|
866
|
+
const objType = obj.constructor.name;
|
|
867
|
+
|
|
868
|
+
const type = this.GetVMType(objType);
|
|
869
|
+
if (type === VMType.None) {
|
|
870
|
+
throw new Error("not a valid object");
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
const result = new VMObject();
|
|
874
|
+
switch (type) {
|
|
875
|
+
case VMType.Bool:
|
|
876
|
+
result.setValue(obj, VMType.Bool);
|
|
877
|
+
break;
|
|
878
|
+
case VMType.Bytes:
|
|
879
|
+
result.setValue(obj, VMType.Bytes);
|
|
880
|
+
break;
|
|
881
|
+
case VMType.String:
|
|
882
|
+
result.setValue(obj, VMType.String);
|
|
883
|
+
break;
|
|
884
|
+
case VMType.Enum:
|
|
885
|
+
result.setValue(obj, VMType.Enum);
|
|
886
|
+
break;
|
|
887
|
+
case VMType.Object:
|
|
888
|
+
result.setValue(obj, VMType.Object);
|
|
889
|
+
break;
|
|
890
|
+
case VMType.Number:
|
|
891
|
+
/*if (objType === Number) {
|
|
892
|
+
obj = BigInt(obj);
|
|
893
|
+
}*/
|
|
894
|
+
result.setValue(obj, VMType.Number);
|
|
895
|
+
break;
|
|
896
|
+
case VMType.Timestamp:
|
|
897
|
+
/*if (objType === "Number") {
|
|
898
|
+
obj = new Timestamp(obj);
|
|
899
|
+
}*/
|
|
900
|
+
result.setValue(obj, VMType.Timestamp);
|
|
901
|
+
break;
|
|
902
|
+
case VMType.Struct:
|
|
903
|
+
result.Type = VMType.Struct;
|
|
904
|
+
if (Array.isArray(obj)) {
|
|
905
|
+
return this.FromArray(obj);
|
|
906
|
+
} else {
|
|
907
|
+
return this.FromStruct(obj);
|
|
908
|
+
}
|
|
909
|
+
break;
|
|
910
|
+
default:
|
|
911
|
+
return null;
|
|
912
|
+
}
|
|
913
|
+
return result;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
public static FromEnum(obj: any): VMObject {
|
|
917
|
+
let vm = new VMObject();
|
|
918
|
+
vm.setValue(obj, VMType.Enum);
|
|
919
|
+
return vm;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
public static FromStruct(obj: any): VMObject {
|
|
923
|
+
let vm = new VMObject();
|
|
924
|
+
return vm.CastViaReflection(obj, 0, false);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
// Serialization
|
|
928
|
+
public static FromBytes(bytes: any): VMObject {
|
|
929
|
+
var result = new VMObject();
|
|
930
|
+
var reader = new PBinaryReader(bytes);
|
|
931
|
+
result.UnserializeData(reader);
|
|
932
|
+
return result;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
SerializeData(writer: PBinaryWriter) {
|
|
936
|
+
writer.writeByte(this.Type as number);
|
|
937
|
+
if (this.Type == VMType.None) {
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
let dataType = typeof this.Data;
|
|
942
|
+
|
|
943
|
+
switch (this.Type) {
|
|
944
|
+
case VMType.Struct: {
|
|
945
|
+
let children = this.GetChildren();
|
|
946
|
+
writer.writeVarInt(children.size);
|
|
947
|
+
for (const child of children) {
|
|
948
|
+
child[0].SerializeData(writer);
|
|
949
|
+
//console.log(Base16.encodeUint8Array(writer.toUint8Array()));
|
|
950
|
+
|
|
951
|
+
child[1].SerializeData(writer);
|
|
952
|
+
///console.log(Base16.encodeUint8Array(writer.toUint8Array()));
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/*children.forEach((key, value) => {
|
|
956
|
+
key.SerializeData(writer);
|
|
957
|
+
value.SerializeData(writer);
|
|
958
|
+
});*/
|
|
959
|
+
break;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
case VMType.Object: {
|
|
963
|
+
var obj = this.Data as ISerializable;
|
|
964
|
+
|
|
965
|
+
if (obj != null) {
|
|
966
|
+
var bytes = Serialization.Serialize(obj);
|
|
967
|
+
var uintBytes = uint8ArrayToBytes(bytes);
|
|
968
|
+
writer.writeByteArray(uintBytes);
|
|
969
|
+
} else {
|
|
970
|
+
throw `Objects of type ${dataType} cannot be serialized`;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
case VMType.Enum: {
|
|
977
|
+
let temp2: number = 0;
|
|
978
|
+
temp2 = this.Data as unknown as number;
|
|
979
|
+
let uint8array = new Uint8Array(4);
|
|
980
|
+
writer = new PBinaryWriter(uint8array);
|
|
981
|
+
writer.writeByte(this.Type as number);
|
|
982
|
+
writer.writeEnum(temp2);
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
default:
|
|
986
|
+
let localBytes = Serialization.Serialize(this.Data);
|
|
987
|
+
writer.writeByteArray(localBytes);
|
|
988
|
+
break;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
return writer.toUint8Array();
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
public SerializeObjectCall(writer: PBinaryWriter) {
|
|
995
|
+
if (this.Type == VMType.None) {
|
|
996
|
+
return;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
let dataType = typeof this.Data;
|
|
1000
|
+
|
|
1001
|
+
switch (this.Type) {
|
|
1002
|
+
case VMType.Struct: {
|
|
1003
|
+
let children = this.GetChildren();
|
|
1004
|
+
writer.writeVarInt(children.size);
|
|
1005
|
+
for (const child of children) {
|
|
1006
|
+
child[0].SerializeData(writer);
|
|
1007
|
+
child[1].SerializeData(writer);
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
/*children.forEach((key, value) => {
|
|
1011
|
+
key.SerializeData(writer);
|
|
1012
|
+
value.SerializeData(writer);
|
|
1013
|
+
});*/
|
|
1014
|
+
break;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
case VMType.Object: {
|
|
1018
|
+
var obj = this.Data as ISerializable;
|
|
1019
|
+
|
|
1020
|
+
if (obj != null) {
|
|
1021
|
+
var bytes = Serialization.Serialize(obj);
|
|
1022
|
+
var uintBytes = uint8ArrayToBytes(bytes);
|
|
1023
|
+
writer.writeByteArray(uintBytes);
|
|
1024
|
+
} else {
|
|
1025
|
+
throw `Objects of type ${dataType} cannot be serialized`;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
break;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
case VMType.Enum: {
|
|
1032
|
+
let temp2: number = 0;
|
|
1033
|
+
temp2 = this.Data as unknown as number;
|
|
1034
|
+
let uint8array = new Uint8Array(4);
|
|
1035
|
+
writer = new PBinaryWriter(uint8array);
|
|
1036
|
+
writer.writeEnum(temp2);
|
|
1037
|
+
break;
|
|
1038
|
+
}
|
|
1039
|
+
default:
|
|
1040
|
+
let localBytes = Serialization.Serialize(this.Data);
|
|
1041
|
+
writer.writeByteArray(uint8ArrayToBytes(localBytes));
|
|
1042
|
+
break;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
return writer.toUint8Array();
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
/*UnserializeData(reader: PBinaryReader) {
|
|
1049
|
+
this.Type = reader.readByte();
|
|
1050
|
+
if (this.Type == VMType.None) {
|
|
1051
|
+
return;
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
switch (this.Type) {
|
|
1055
|
+
case VMType.Struct: {
|
|
1056
|
+
let children = new Map<VMObject, VMObject>();
|
|
1057
|
+
let count = reader.readVarInt();
|
|
1058
|
+
for (let i = 0; i < count; i++) {
|
|
1059
|
+
let key = new VMObject();
|
|
1060
|
+
key.UnserializeData(reader);
|
|
1061
|
+
let value = new VMObject();
|
|
1062
|
+
value.UnserializeData(reader);
|
|
1063
|
+
children.set(key, value);
|
|
1064
|
+
}
|
|
1065
|
+
this.Data = children;
|
|
1066
|
+
break;
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
case VMType.Object: {
|
|
1070
|
+
var bytes = reader.readByteArray();
|
|
1071
|
+
var obj = Serialization.Unserialize(bytes);
|
|
1072
|
+
this.Data = obj as Object;
|
|
1073
|
+
break;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
case VMType.Enum: {
|
|
1077
|
+
let temp = reader.readVarInt();
|
|
1078
|
+
this.Data = temp as unknown as Enumerator;
|
|
1079
|
+
break;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
default:
|
|
1083
|
+
this.Data = Serialization.UnserializeObject(reader, null);
|
|
1084
|
+
break;
|
|
1085
|
+
}
|
|
1086
|
+
}*/
|
|
1087
|
+
|
|
1088
|
+
UnserializeData(reader: PBinaryReader) {
|
|
1089
|
+
this.Type = reader.readByte() as VMType;
|
|
1090
|
+
switch (this.Type) {
|
|
1091
|
+
case VMType.Bool:
|
|
1092
|
+
this.Data = Serialization.Unserialize<Boolean>(reader, Boolean);
|
|
1093
|
+
break;
|
|
1094
|
+
|
|
1095
|
+
case VMType.Bytes:
|
|
1096
|
+
this.Data = Serialization.Unserialize<Uint8Array>(reader, Uint8Array);
|
|
1097
|
+
break;
|
|
1098
|
+
|
|
1099
|
+
case VMType.Number:
|
|
1100
|
+
this.Data = reader.readBigInteger();
|
|
1101
|
+
break;
|
|
1102
|
+
|
|
1103
|
+
case VMType.Timestamp:
|
|
1104
|
+
this.Data = reader.readTimestamp();
|
|
1105
|
+
/*this.Data = Serialization.UnserializeObject<Timestamp>(
|
|
1106
|
+
reader,
|
|
1107
|
+
Timestamp
|
|
1108
|
+
);*/
|
|
1109
|
+
break;
|
|
1110
|
+
|
|
1111
|
+
case VMType.String:
|
|
1112
|
+
this.Data = reader.readVarString() as String;
|
|
1113
|
+
break;
|
|
1114
|
+
|
|
1115
|
+
case VMType.Struct:
|
|
1116
|
+
let childCount = reader.readVarInt();
|
|
1117
|
+
let children = new Map<VMObject, VMObject>();
|
|
1118
|
+
while (childCount > 0) {
|
|
1119
|
+
let key = new VMObject();
|
|
1120
|
+
key.UnserializeData(reader);
|
|
1121
|
+
|
|
1122
|
+
VMObject.ValidateStructKey(key);
|
|
1123
|
+
|
|
1124
|
+
let val = new VMObject();
|
|
1125
|
+
val.UnserializeData(reader);
|
|
1126
|
+
|
|
1127
|
+
children.set(key, val);
|
|
1128
|
+
childCount--;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
this.Data = children;
|
|
1132
|
+
break;
|
|
1133
|
+
|
|
1134
|
+
case VMType.Object:
|
|
1135
|
+
let bytes = reader.readByteArray();
|
|
1136
|
+
|
|
1137
|
+
if (bytes.length == 35) {
|
|
1138
|
+
let addr = Serialization.Unserialize<Address>(bytes, Address);
|
|
1139
|
+
this.Data = addr;
|
|
1140
|
+
this.Type = VMType.Object;
|
|
1141
|
+
} else {
|
|
1142
|
+
this.Type = VMType.Bytes;
|
|
1143
|
+
this.Data = bytes;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
break;
|
|
1147
|
+
|
|
1148
|
+
case VMType.Enum:
|
|
1149
|
+
this.Type = VMType.Enum;
|
|
1150
|
+
this.Data = reader.readVarInt() as Number;
|
|
1151
|
+
break;
|
|
1152
|
+
|
|
1153
|
+
case VMType.None:
|
|
1154
|
+
this.Type = VMType.None;
|
|
1155
|
+
this.Data = null;
|
|
1156
|
+
break;
|
|
1157
|
+
|
|
1158
|
+
default:
|
|
1159
|
+
throw new Error(`invalid unserialize: type ${this.Type}`);
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
}
|