diff --git a/.gitignore b/.gitignore index 77e8f70b..d0c17f74 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /tmp/ /dist/ /config/dist/ +/lib/ /coverage/ /jsdoc/ .DS_Store diff --git a/Makefile b/Makefile index c926bcb0..a738df16 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ XDR_FILES_CURR= \ Stellar-types.x XDR_FILES_LOCAL_CURR=$(addprefix xdr/curr/,$(XDR_FILES_CURR)) -XDR_BASE_URL_NEXT=https://github.com/stellar/stellar-xdr/raw/next +XDR_BASE_URL_NEXT=https://github.com/stellar/stellar-xdr/raw/2f16687fdf6f4bcfb56805e2035f69997f4b34c4 XDR_BASE_LOCAL_NEXT=xdr/next XDR_FILES_NEXT= \ Stellar-SCP.x \ diff --git a/src/contract.js b/src/contract.js index 2fe9b55c..f691e3fb 100644 --- a/src/contract.js +++ b/src/contract.js @@ -68,7 +68,6 @@ export class Contract { }); } - /** * Returns the read-only footprint entry necessary for any invocations to this * contract, for convenience when adding it to your transaction's overall @@ -79,9 +78,11 @@ export class Contract { getFootprint() { const contractId = Buffer.from(this._id, 'hex'); - return xdr.LedgerKey.contractData(new xdr.LedgerKeyContractData({ - contractId, - key: xdr.ScVal.scvLedgerKeyContractExecutable(), - })); + return xdr.LedgerKey.contractData( + new xdr.LedgerKeyContractData({ + contractId, + key: xdr.ScVal.scvLedgerKeyContractExecutable() + }) + ); } } diff --git a/src/generated/next_generated.js b/src/generated/next_generated.js index 4e1626d3..09daeff2 100644 --- a/src/generated/next_generated.js +++ b/src/generated/next_generated.js @@ -2545,6 +2545,75 @@ var types = XDR.config((xdr) => { ["ext", xdr.lookup("TransactionHistoryResultEntryExt")], ]); + // === xdr source ============================================================ + // + // struct TransactionResultPairV2 + // { + // Hash transactionHash; + // Hash hashOfMetaHashes; // hash of hashes in TransactionMetaV3 + // // TransactionResult is in the meta + // }; + // + // =========================================================================== + xdr.struct("TransactionResultPairV2", [ + ["transactionHash", xdr.lookup("Hash")], + ["hashOfMetaHashes", xdr.lookup("Hash")], + ]); + + // === xdr source ============================================================ + // + // struct TransactionResultSetV2 + // { + // TransactionResultPairV2 results<>; + // }; + // + // =========================================================================== + xdr.struct("TransactionResultSetV2", [ + [ + "results", + xdr.varArray(xdr.lookup("TransactionResultPairV2"), 2147483647), + ], + ]); + + // === xdr source ============================================================ + // + // union switch (int v) + // { + // case 0: + // void; + // } + // + // =========================================================================== + xdr.union("TransactionHistoryResultEntryV2Ext", { + switchOn: xdr.int(), + switchName: "v", + switches: [[0, xdr.void()]], + arms: {}, + }); + + // === xdr source ============================================================ + // + // struct TransactionHistoryResultEntryV2 + // { + // uint32 ledgerSeq; + // TransactionResultSetV2 txResultSet; + // + // // reserved for future use + // union switch (int v) + // { + // case 0: + // void; + // } + // ext; + // }; + // + // =========================================================================== + xdr.struct("TransactionHistoryResultEntryV2", [ + ["ledgerSeq", xdr.lookup("Uint32")], + ["txResultSet", xdr.lookup("TransactionResultSetV2")], + ["ext", xdr.lookup("TransactionHistoryResultEntryV2Ext")], + ]); + // === xdr source ============================================================ // // union switch (int v) @@ -2829,6 +2898,30 @@ var types = XDR.config((xdr) => { ["event", xdr.lookup("ContractEvent")], ]); + // === xdr source ============================================================ + // + // struct OperationDiagnosticEvents + // { + // DiagnosticEvent events<>; + // }; + // + // =========================================================================== + xdr.struct("OperationDiagnosticEvents", [ + ["events", xdr.varArray(xdr.lookup("DiagnosticEvent"), 2147483647)], + ]); + + // === xdr source ============================================================ + // + // struct OperationEvents + // { + // ContractEvent events<>; + // }; + // + // =========================================================================== + xdr.struct("OperationEvents", [ + ["events", xdr.varArray(xdr.lookup("ContractEvent"), 2147483647)], + ]); + // === xdr source ============================================================ // // struct TransactionMetaV3 @@ -2838,14 +2931,17 @@ var types = XDR.config((xdr) => { // OperationMeta operations<>; // meta for each operation // LedgerEntryChanges txChangesAfter; // tx level changes after operations are // // applied if any - // ContractEvent events<>; // custom events populated by the - // // contracts themselves. - // SCVal returnValues; // return values of each invocation. + // OperationEvents events<>; // custom events populated by the + // // contracts themselves. One list per operation. + // TransactionResult txResult; // - // // Diagnostics events that are not hashed. + // Hash hashes[3]; // stores sha256(txChangesBefore, operations, txChangesAfter), + // // sha256(events), and sha256(txResult) + // + // // Diagnostics events that are not hashed. One list per operation. // // This will contain all contract and diagnostic events. Even ones // // that were emitted in a failed contract call. - // DiagnosticEvent diagnosticEvents<>; + // OperationDiagnosticEvents diagnosticEvents<>; // }; // // =========================================================================== @@ -2853,34 +2949,15 @@ var types = XDR.config((xdr) => { ["txChangesBefore", xdr.lookup("LedgerEntryChanges")], ["operations", xdr.varArray(xdr.lookup("OperationMeta"), 2147483647)], ["txChangesAfter", xdr.lookup("LedgerEntryChanges")], - ["events", xdr.varArray(xdr.lookup("ContractEvent"), 2147483647)], - [ - "returnValues", - xdr.varArray(xdr.lookup("ScVal"), xdr.lookup("MAX_OPS_PER_TX")), - ], + ["events", xdr.varArray(xdr.lookup("OperationEvents"), 2147483647)], + ["txResult", xdr.lookup("TransactionResult")], + ["hashes", xdr.array(xdr.lookup("Hash"), 3)], [ "diagnosticEvents", - xdr.varArray(xdr.lookup("DiagnosticEvent"), 2147483647), + xdr.varArray(xdr.lookup("OperationDiagnosticEvents"), 2147483647), ], ]); - // === xdr source ============================================================ - // - // struct InvokeHostFunctionSuccessPreImage - // { - // SCVal returnValues; - // ContractEvent events<>; - // }; - // - // =========================================================================== - xdr.struct("InvokeHostFunctionSuccessPreImage", [ - [ - "returnValues", - xdr.varArray(xdr.lookup("ScVal"), xdr.lookup("MAX_OPS_PER_TX")), - ], - ["events", xdr.varArray(xdr.lookup("ContractEvent"), 2147483647)], - ]); - // === xdr source ============================================================ // // union TransactionMeta switch (int v) @@ -2929,6 +3006,22 @@ var types = XDR.config((xdr) => { ["txApplyProcessing", xdr.lookup("TransactionMeta")], ]); + // === xdr source ============================================================ + // + // struct TransactionResultMetaV2 + // { + // TransactionResultPairV2 result; + // LedgerEntryChanges feeProcessing; + // TransactionMeta txApplyProcessing; + // }; + // + // =========================================================================== + xdr.struct("TransactionResultMetaV2", [ + ["result", xdr.lookup("TransactionResultPairV2")], + ["feeProcessing", xdr.lookup("LedgerEntryChanges")], + ["txApplyProcessing", xdr.lookup("TransactionMeta")], + ]); + // === xdr source ============================================================ // // struct UpgradeEntryMeta @@ -3013,6 +3106,41 @@ var types = XDR.config((xdr) => { ["scpInfo", xdr.varArray(xdr.lookup("ScpHistoryEntry"), 2147483647)], ]); + // === xdr source ============================================================ + // + // struct LedgerCloseMetaV2 + // { + // LedgerHeaderHistoryEntry ledgerHeader; + // + // GeneralizedTransactionSet txSet; + // + // // NB: transactions are sorted in apply order here + // // fees for all transactions are processed first + // // followed by applying transactions + // TransactionResultMetaV2 txProcessing<>; + // + // // upgrades are applied last + // UpgradeEntryMeta upgradesProcessing<>; + // + // // other misc information attached to the ledger close + // SCPHistoryEntry scpInfo<>; + // }; + // + // =========================================================================== + xdr.struct("LedgerCloseMetaV2", [ + ["ledgerHeader", xdr.lookup("LedgerHeaderHistoryEntry")], + ["txSet", xdr.lookup("GeneralizedTransactionSet")], + [ + "txProcessing", + xdr.varArray(xdr.lookup("TransactionResultMetaV2"), 2147483647), + ], + [ + "upgradesProcessing", + xdr.varArray(xdr.lookup("UpgradeEntryMeta"), 2147483647), + ], + ["scpInfo", xdr.varArray(xdr.lookup("ScpHistoryEntry"), 2147483647)], + ]); + // === xdr source ============================================================ // // union LedgerCloseMeta switch (int v) @@ -3021,6 +3149,8 @@ var types = XDR.config((xdr) => { // LedgerCloseMetaV0 v0; // case 1: // LedgerCloseMetaV1 v1; + // case 2: + // LedgerCloseMetaV2 v2; // }; // // =========================================================================== @@ -3030,10 +3160,12 @@ var types = XDR.config((xdr) => { switches: [ [0, "v0"], [1, "v1"], + [2, "v2"], ], arms: { v0: xdr.lookup("LedgerCloseMetaV0"), v1: xdr.lookup("LedgerCloseMetaV1"), + v2: xdr.lookup("LedgerCloseMetaV2"), }, }); @@ -7146,7 +7278,7 @@ var types = XDR.config((xdr) => { // union InvokeHostFunctionResult switch (InvokeHostFunctionResultCode code) // { // case INVOKE_HOST_FUNCTION_SUCCESS: - // Hash success; // sha256(InvokeHostFunctionSuccessPreImage) + // SCVal success; // case INVOKE_HOST_FUNCTION_MALFORMED: // case INVOKE_HOST_FUNCTION_TRAPPED: // case INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED: @@ -7164,7 +7296,7 @@ var types = XDR.config((xdr) => { ["invokeHostFunctionResourceLimitExceeded", xdr.void()], ], arms: { - success: xdr.lookup("Hash"), + success: xdr.varArray(xdr.lookup("ScVal"), xdr.lookup("MAX_OPS_PER_TX")), }, }); diff --git a/src/transaction_base.js b/src/transaction_base.js index 6c8bcea9..c40f88a1 100644 --- a/src/transaction_base.js +++ b/src/transaction_base.js @@ -73,7 +73,7 @@ export class TransactionBase { const requiresContractSignatures = (this.operations || []).some( (op) => op.type === 'invokeHostFunction' && - op.functions.some(fn => fn.auth().some((a) => a.addressWithNonce())) + op.functions.some((fn) => fn.auth().some((a) => a.addressWithNonce())) ); if (requiresContractSignatures) { throw new Error( diff --git a/types/next.d.ts b/types/next.d.ts index a4112c3d..8e1118d0 100644 --- a/types/next.d.ts +++ b/types/next.d.ts @@ -41,8 +41,6 @@ declare namespace xdrHidden { export namespace xdr { export import Operation = xdrHidden.Operation2; // tslint:disable-line:strict-export-declare-modifiers - type Hash = Opaque[]; // workaround, cause unknown - interface SignedInt { readonly MAX_VALUE: 2147483647; readonly MIN_VALUE: -2147483648; @@ -216,6 +214,8 @@ export namespace xdr { validateXDR(input: string, format: 'hex' | 'base64'): boolean; } + type Hash = Opaque[]; // workaround, cause unknown + class VarOpaque extends Opaque {} class Option { @@ -4425,6 +4425,111 @@ export namespace xdr { static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } + class TransactionResultPairV2 { + constructor(attributes: { + transactionHash: Buffer; + hashOfMetaHashes: Buffer; + }); + + transactionHash(value?: Buffer): Buffer; + + hashOfMetaHashes(value?: Buffer): Buffer; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): TransactionResultPairV2; + + static write(value: TransactionResultPairV2, io: Buffer): void; + + static isValid(value: TransactionResultPairV2): boolean; + + static toXDR(value: TransactionResultPairV2): Buffer; + + static fromXDR(input: Buffer, format?: 'raw'): TransactionResultPairV2; + + static fromXDR( + input: string, + format: 'hex' | 'base64' + ): TransactionResultPairV2; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + + class TransactionResultSetV2 { + constructor(attributes: { results: TransactionResultPairV2[] }); + + results(value?: TransactionResultPairV2[]): TransactionResultPairV2[]; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): TransactionResultSetV2; + + static write(value: TransactionResultSetV2, io: Buffer): void; + + static isValid(value: TransactionResultSetV2): boolean; + + static toXDR(value: TransactionResultSetV2): Buffer; + + static fromXDR(input: Buffer, format?: 'raw'): TransactionResultSetV2; + + static fromXDR( + input: string, + format: 'hex' | 'base64' + ): TransactionResultSetV2; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + + class TransactionHistoryResultEntryV2 { + constructor(attributes: { + ledgerSeq: number; + txResultSet: TransactionResultSetV2; + ext: TransactionHistoryResultEntryV2Ext; + }); + + ledgerSeq(value?: number): number; + + txResultSet(value?: TransactionResultSetV2): TransactionResultSetV2; + + ext( + value?: TransactionHistoryResultEntryV2Ext + ): TransactionHistoryResultEntryV2Ext; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): TransactionHistoryResultEntryV2; + + static write(value: TransactionHistoryResultEntryV2, io: Buffer): void; + + static isValid(value: TransactionHistoryResultEntryV2): boolean; + + static toXDR(value: TransactionHistoryResultEntryV2): Buffer; + + static fromXDR( + input: Buffer, + format?: 'raw' + ): TransactionHistoryResultEntryV2; + + static fromXDR( + input: string, + format: 'hex' | 'base64' + ): TransactionHistoryResultEntryV2; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + class LedgerHeaderHistoryEntry { constructor(attributes: { hash: Buffer; @@ -4708,14 +4813,70 @@ export namespace xdr { static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } + class OperationDiagnosticEvents { + constructor(attributes: { events: DiagnosticEvent[] }); + + events(value?: DiagnosticEvent[]): DiagnosticEvent[]; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): OperationDiagnosticEvents; + + static write(value: OperationDiagnosticEvents, io: Buffer): void; + + static isValid(value: OperationDiagnosticEvents): boolean; + + static toXDR(value: OperationDiagnosticEvents): Buffer; + + static fromXDR(input: Buffer, format?: 'raw'): OperationDiagnosticEvents; + + static fromXDR( + input: string, + format: 'hex' | 'base64' + ): OperationDiagnosticEvents; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + + class OperationEvents { + constructor(attributes: { events: ContractEvent[] }); + + events(value?: ContractEvent[]): ContractEvent[]; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): OperationEvents; + + static write(value: OperationEvents, io: Buffer): void; + + static isValid(value: OperationEvents): boolean; + + static toXDR(value: OperationEvents): Buffer; + + static fromXDR(input: Buffer, format?: 'raw'): OperationEvents; + + static fromXDR(input: string, format: 'hex' | 'base64'): OperationEvents; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + class TransactionMetaV3 { constructor(attributes: { txChangesBefore: LedgerEntryChange[]; operations: OperationMeta[]; txChangesAfter: LedgerEntryChange[]; - events: ContractEvent[]; - returnValues: ScVal[]; - diagnosticEvents: DiagnosticEvent[]; + events: OperationEvents[]; + txResult: TransactionResult; + hashes: Buffer[]; + diagnosticEvents: OperationDiagnosticEvents[]; }); txChangesBefore(value?: LedgerEntryChange[]): LedgerEntryChange[]; @@ -4724,11 +4885,15 @@ export namespace xdr { txChangesAfter(value?: LedgerEntryChange[]): LedgerEntryChange[]; - events(value?: ContractEvent[]): ContractEvent[]; + events(value?: OperationEvents[]): OperationEvents[]; + + txResult(value?: TransactionResult): TransactionResult; - returnValues(value?: ScVal[]): ScVal[]; + hashes(value?: Buffer[]): Buffer[]; - diagnosticEvents(value?: DiagnosticEvent[]): DiagnosticEvent[]; + diagnosticEvents( + value?: OperationDiagnosticEvents[] + ): OperationDiagnosticEvents[]; toXDR(format?: 'raw'): Buffer; @@ -4751,48 +4916,51 @@ export namespace xdr { static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } - class InvokeHostFunctionSuccessPreImage { - constructor(attributes: { returnValues: ScVal[]; events: ContractEvent[] }); + class TransactionResultMeta { + constructor(attributes: { + result: TransactionResultPair; + feeProcessing: LedgerEntryChange[]; + txApplyProcessing: TransactionMeta; + }); - returnValues(value?: ScVal[]): ScVal[]; + result(value?: TransactionResultPair): TransactionResultPair; - events(value?: ContractEvent[]): ContractEvent[]; + feeProcessing(value?: LedgerEntryChange[]): LedgerEntryChange[]; + + txApplyProcessing(value?: TransactionMeta): TransactionMeta; toXDR(format?: 'raw'): Buffer; toXDR(format: 'hex' | 'base64'): string; - static read(io: Buffer): InvokeHostFunctionSuccessPreImage; + static read(io: Buffer): TransactionResultMeta; - static write(value: InvokeHostFunctionSuccessPreImage, io: Buffer): void; + static write(value: TransactionResultMeta, io: Buffer): void; - static isValid(value: InvokeHostFunctionSuccessPreImage): boolean; + static isValid(value: TransactionResultMeta): boolean; - static toXDR(value: InvokeHostFunctionSuccessPreImage): Buffer; + static toXDR(value: TransactionResultMeta): Buffer; - static fromXDR( - input: Buffer, - format?: 'raw' - ): InvokeHostFunctionSuccessPreImage; + static fromXDR(input: Buffer, format?: 'raw'): TransactionResultMeta; static fromXDR( input: string, format: 'hex' | 'base64' - ): InvokeHostFunctionSuccessPreImage; + ): TransactionResultMeta; static validateXDR(input: Buffer, format?: 'raw'): boolean; static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } - class TransactionResultMeta { + class TransactionResultMetaV2 { constructor(attributes: { - result: TransactionResultPair; + result: TransactionResultPairV2; feeProcessing: LedgerEntryChange[]; txApplyProcessing: TransactionMeta; }); - result(value?: TransactionResultPair): TransactionResultPair; + result(value?: TransactionResultPairV2): TransactionResultPairV2; feeProcessing(value?: LedgerEntryChange[]): LedgerEntryChange[]; @@ -4802,20 +4970,20 @@ export namespace xdr { toXDR(format: 'hex' | 'base64'): string; - static read(io: Buffer): TransactionResultMeta; + static read(io: Buffer): TransactionResultMetaV2; - static write(value: TransactionResultMeta, io: Buffer): void; + static write(value: TransactionResultMetaV2, io: Buffer): void; - static isValid(value: TransactionResultMeta): boolean; + static isValid(value: TransactionResultMetaV2): boolean; - static toXDR(value: TransactionResultMeta): Buffer; + static toXDR(value: TransactionResultMetaV2): Buffer; - static fromXDR(input: Buffer, format?: 'raw'): TransactionResultMeta; + static fromXDR(input: Buffer, format?: 'raw'): TransactionResultMetaV2; static fromXDR( input: string, format: 'hex' | 'base64' - ): TransactionResultMeta; + ): TransactionResultMetaV2; static validateXDR(input: Buffer, format?: 'raw'): boolean; @@ -4933,6 +5101,46 @@ export namespace xdr { static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } + class LedgerCloseMetaV2 { + constructor(attributes: { + ledgerHeader: LedgerHeaderHistoryEntry; + txSet: GeneralizedTransactionSet; + txProcessing: TransactionResultMetaV2[]; + upgradesProcessing: UpgradeEntryMeta[]; + scpInfo: ScpHistoryEntry[]; + }); + + ledgerHeader(value?: LedgerHeaderHistoryEntry): LedgerHeaderHistoryEntry; + + txSet(value?: GeneralizedTransactionSet): GeneralizedTransactionSet; + + txProcessing(value?: TransactionResultMetaV2[]): TransactionResultMetaV2[]; + + upgradesProcessing(value?: UpgradeEntryMeta[]): UpgradeEntryMeta[]; + + scpInfo(value?: ScpHistoryEntry[]): ScpHistoryEntry[]; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): LedgerCloseMetaV2; + + static write(value: LedgerCloseMetaV2, io: Buffer): void; + + static isValid(value: LedgerCloseMetaV2): boolean; + + static toXDR(value: LedgerCloseMetaV2): Buffer; + + static fromXDR(input: Buffer, format?: 'raw'): LedgerCloseMetaV2; + + static fromXDR(input: string, format: 'hex' | 'base64'): LedgerCloseMetaV2; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + class Error { constructor(attributes: { code: ErrorCode; msg: string | Buffer }); @@ -10289,6 +10497,40 @@ export namespace xdr { static validateXDR(input: string, format: 'hex' | 'base64'): boolean; } + class TransactionHistoryResultEntryV2Ext { + switch(): number; + + static 0(): TransactionHistoryResultEntryV2Ext; + + value(): void; + + toXDR(format?: 'raw'): Buffer; + + toXDR(format: 'hex' | 'base64'): string; + + static read(io: Buffer): TransactionHistoryResultEntryV2Ext; + + static write(value: TransactionHistoryResultEntryV2Ext, io: Buffer): void; + + static isValid(value: TransactionHistoryResultEntryV2Ext): boolean; + + static toXDR(value: TransactionHistoryResultEntryV2Ext): Buffer; + + static fromXDR( + input: Buffer, + format?: 'raw' + ): TransactionHistoryResultEntryV2Ext; + + static fromXDR( + input: string, + format: 'hex' | 'base64' + ): TransactionHistoryResultEntryV2Ext; + + static validateXDR(input: Buffer, format?: 'raw'): boolean; + + static validateXDR(input: string, format: 'hex' | 'base64'): boolean; + } + class LedgerHeaderHistoryEntryExt { switch(): number; @@ -10475,11 +10717,15 @@ export namespace xdr { v1(value?: LedgerCloseMetaV1): LedgerCloseMetaV1; + v2(value?: LedgerCloseMetaV2): LedgerCloseMetaV2; + static 0(value: LedgerCloseMetaV0): LedgerCloseMeta; static 1(value: LedgerCloseMetaV1): LedgerCloseMeta; - value(): LedgerCloseMetaV0 | LedgerCloseMetaV1; + static 2(value: LedgerCloseMetaV2): LedgerCloseMeta; + + value(): LedgerCloseMetaV0 | LedgerCloseMetaV1 | LedgerCloseMetaV2; toXDR(format?: 'raw'): Buffer; @@ -12630,9 +12876,9 @@ export namespace xdr { class InvokeHostFunctionResult { switch(): InvokeHostFunctionResultCode; - success(value?: Buffer): Buffer; + success(value?: ScVal[]): ScVal[]; - static invokeHostFunctionSuccess(value: Buffer): InvokeHostFunctionResult; + static invokeHostFunctionSuccess(value: ScVal[]): InvokeHostFunctionResult; static invokeHostFunctionMalformed(): InvokeHostFunctionResult; @@ -12640,7 +12886,7 @@ export namespace xdr { static invokeHostFunctionResourceLimitExceeded(): InvokeHostFunctionResult; - value(): Buffer | void; + value(): ScVal[] | void; toXDR(format?: 'raw'): Buffer; diff --git a/xdr/next/Stellar-ledger.x b/xdr/next/Stellar-ledger.x index 8c9458e4..79d3d45d 100644 --- a/xdr/next/Stellar-ledger.x +++ b/xdr/next/Stellar-ledger.x @@ -280,6 +280,32 @@ struct TransactionHistoryResultEntry ext; }; +struct TransactionResultPairV2 +{ + Hash transactionHash; + Hash hashOfMetaHashes; // hash of hashes in TransactionMetaV3 + // TransactionResult is in the meta +}; + +struct TransactionResultSetV2 +{ + TransactionResultPairV2 results<>; +}; + +struct TransactionHistoryResultEntryV2 +{ + uint32 ledgerSeq; + TransactionResultSetV2 txResultSet; + + // reserved for future use + union switch (int v) + { + case 0: + void; + } + ext; +}; + struct LedgerHeaderHistoryEntry { Hash hash; @@ -398,6 +424,16 @@ struct DiagnosticEvent ContractEvent event; }; +struct OperationDiagnosticEvents +{ + DiagnosticEvent events<>; +}; + +struct OperationEvents +{ + ContractEvent events<>; +}; + struct TransactionMetaV3 { LedgerEntryChanges txChangesBefore; // tx level changes before operations @@ -405,21 +441,17 @@ struct TransactionMetaV3 OperationMeta operations<>; // meta for each operation LedgerEntryChanges txChangesAfter; // tx level changes after operations are // applied if any - ContractEvent events<>; // custom events populated by the - // contracts themselves. - SCVal returnValues; // return values of each invocation. + OperationEvents events<>; // custom events populated by the + // contracts themselves. One list per operation. + TransactionResult txResult; - // Diagnostics events that are not hashed. + Hash hashes[3]; // stores sha256(txChangesBefore, operations, txChangesAfter), + // sha256(events), and sha256(txResult) + + // Diagnostics events that are not hashed. One list per operation. // This will contain all contract and diagnostic events. Even ones // that were emitted in a failed contract call. - DiagnosticEvent diagnosticEvents<>; -}; - -// This is in Stellar-ledger.x to due to a circular dependency -struct InvokeHostFunctionSuccessPreImage -{ - SCVal returnValues; - ContractEvent events<>; + OperationDiagnosticEvents diagnosticEvents<>; }; // this is the meta produced when applying transactions @@ -446,6 +478,13 @@ struct TransactionResultMeta TransactionMeta txApplyProcessing; }; +struct TransactionResultMetaV2 +{ + TransactionResultPairV2 result; + LedgerEntryChanges feeProcessing; + TransactionMeta txApplyProcessing; +}; + // this represents a single upgrade that was performed as part of a ledger // upgrade struct UpgradeEntryMeta @@ -490,11 +529,32 @@ struct LedgerCloseMetaV1 SCPHistoryEntry scpInfo<>; }; +// only difference between V1 and V2 is this uses TransactionResultMetaV2 +struct LedgerCloseMetaV2 +{ + LedgerHeaderHistoryEntry ledgerHeader; + + GeneralizedTransactionSet txSet; + + // NB: transactions are sorted in apply order here + // fees for all transactions are processed first + // followed by applying transactions + TransactionResultMetaV2 txProcessing<>; + + // upgrades are applied last + UpgradeEntryMeta upgradesProcessing<>; + + // other misc information attached to the ledger close + SCPHistoryEntry scpInfo<>; +}; + union LedgerCloseMeta switch (int v) { case 0: LedgerCloseMetaV0 v0; case 1: LedgerCloseMetaV1 v1; +case 2: + LedgerCloseMetaV2 v2; }; } diff --git a/xdr/next/Stellar-transaction.x b/xdr/next/Stellar-transaction.x index 127625bf..ec1538a9 100644 --- a/xdr/next/Stellar-transaction.x +++ b/xdr/next/Stellar-transaction.x @@ -1779,7 +1779,7 @@ enum InvokeHostFunctionResultCode union InvokeHostFunctionResult switch (InvokeHostFunctionResultCode code) { case INVOKE_HOST_FUNCTION_SUCCESS: - Hash success; // sha256(InvokeHostFunctionSuccessPreImage) + SCVal success; case INVOKE_HOST_FUNCTION_MALFORMED: case INVOKE_HOST_FUNCTION_TRAPPED: case INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED: