From 38b68dbe8010c4e1162ee1d7237b4da39754f1db Mon Sep 17 00:00:00 2001 From: "Fifo (Fabricius Zatti)" <62725221+fazzatti@users.noreply.github.com> Date: Tue, 7 May 2024 13:28:44 -0300 Subject: [PATCH] feat: remove spec requirement for contract engine (#145) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) * test: add build transaction unit tests * chore: merge with develop * test: add build transaction failure tests * refactor: make networkConfig variable private * test: add unit test for fee bump pipeline (#113) * test: add unit tests for classic signature requirements pipeline (#115) * Adjustments to release library as open source 🚀 (#107) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) --------- Co-authored-by: Bruno Nascimento * fix: setoptions op threshold requirement * fix: revoke operation variants threshold calculation * test: add unit tests to classig sign requirements pipeline * refactor: rearrange as per aaa pattern --------- Co-authored-by: Bruno Nascimento * Add unit tests for simulate transaction pipeline (#117) * refactor: eslint adjustments * test: initial simulate transaction unit tests * feat: add assemble transaction sp error * test: complete coverage for simulate transaction pipeline * refactor: clean up comments and adjust imports * Add unit tests for classic transaction pipeline (#118) * test: add unit tests for classic transaction pipeline * refactor: adjust imports * test: add unit tests for soroban transaction pipeline (#119) * test: add unit test for sign transaction pipeline * test: add unit test for submit transaction pipeline * Add unit tests soroban auth (#123) * fix: remove validation from contract engine initialization * style: remove comment * feat: modify account handler mocker payload * test: add unit test to soroban auth pipeline --------- Co-authored-by: Bruno Nascimento * Complete unit test coverage for account handlers (#125) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * Create test-coverage.yml action (#126) * Create test-coverage.yml action * Update test-coverage.yml * Add unit test for base account handler (#127) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * test: add unit tests for base account handler * Add unit test for soroban get transaction pipeline (#124) * refactor: soroban get transaction pipeline constructor * fix: remove old log * test: add unit tests for soroban get transaction pipeline * style: adjust imports * Add unit tests for the classic asset handler (#128) * refactor: adjust outter imports/exports * test: add unit tests for the classic asset handler * feat: remove issuer requirement for classic assets (#129) * refactor: allow for no payload for dah * feat: remove issuer necessity for classic assets to better include native * test: add unit test to soroban token handler (#131) * feat: remove helper classes for account (#132) * feat: remove helper classes for account * refactor: remove unused error for base account * test: complete unit coverage for base account errors * Standardize default network configs and custom (#133) * feat: standardize network config options as functions under network * test: adjust tests for new network config format * feat: require rpc url for default rpc handler to initialize * feat: require horizon url to initialize default horizon handler * test: remove local testing from coverage * feat: remove soroban client * feat: convert horizon load account error to sp error * feat: add allowhttp to network config * test: add unit tests to default horizon handler * test: add default rpc handler unit tests * fix: account changes with network new config format * test: add network configuration unit tests * refactor: allowhttp object Co-authored-by: Caio Teixeira --------- Co-authored-by: Caio Teixeira * packaging: bump version to v0.8.0 * Fix merge issues (#137) * feat: standardize network config options as functions under network * fix: duplicate imports * Update stellar sdk (#139) * Release v0.8.0 (#136) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) * test: add build transaction unit tests * chore: merge with develop * test: add build transaction failure tests * refactor: make networkConfig variable private * test: add unit test for fee bump pipeline (#113) * test: add unit tests for classic signature requirements pipeline (#115) * Adjustments to release library as open source 🚀 (#107) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) --------- Co-authored-by: Bruno Nascimento * fix: setoptions op threshold requirement * fix: revoke operation variants threshold calculation * test: add unit tests to classig sign requirements pipeline * refactor: rearrange as per aaa pattern --------- Co-authored-by: Bruno Nascimento * Add unit tests for simulate transaction pipeline (#117) * refactor: eslint adjustments * test: initial simulate transaction unit tests * feat: add assemble transaction sp error * test: complete coverage for simulate transaction pipeline * refactor: clean up comments and adjust imports * Add unit tests for classic transaction pipeline (#118) * test: add unit tests for classic transaction pipeline * refactor: adjust imports * test: add unit tests for soroban transaction pipeline (#119) * test: add unit test for sign transaction pipeline * test: add unit test for submit transaction pipeline * Add unit tests soroban auth (#123) * fix: remove validation from contract engine initialization * style: remove comment * feat: modify account handler mocker payload * test: add unit test to soroban auth pipeline --------- Co-authored-by: Bruno Nascimento * Complete unit test coverage for account handlers (#125) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * Create test-coverage.yml action (#126) * Create test-coverage.yml action * Update test-coverage.yml * Add unit test for base account handler (#127) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * test: add unit tests for base account handler * Add unit test for soroban get transaction pipeline (#124) * refactor: soroban get transaction pipeline constructor * fix: remove old log * test: add unit tests for soroban get transaction pipeline * style: adjust imports * Add unit tests for the classic asset handler (#128) * refactor: adjust outter imports/exports * test: add unit tests for the classic asset handler * feat: remove issuer requirement for classic assets (#129) * refactor: allow for no payload for dah * feat: remove issuer necessity for classic assets to better include native * test: add unit test to soroban token handler (#131) * feat: remove helper classes for account (#132) * feat: remove helper classes for account * refactor: remove unused error for base account * test: complete unit coverage for base account errors * Standardize default network configs and custom (#133) * feat: standardize network config options as functions under network * test: adjust tests for new network config format * feat: require rpc url for default rpc handler to initialize * feat: require horizon url to initialize default horizon handler * test: remove local testing from coverage * feat: remove soroban client * feat: convert horizon load account error to sp error * feat: add allowhttp to network config * test: add unit tests to default horizon handler * test: add default rpc handler unit tests * fix: account changes with network new config format * test: add network configuration unit tests * refactor: allowhttp object Co-authored-by: Caio Teixeira --------- Co-authored-by: Caio Teixeira * packaging: bump version to v0.8.0 * Fix merge issues (#137) * feat: standardize network config options as functions under network * fix: duplicate imports --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira * chore: update stellar sdk * feat: add function to return secret key to default account handler * test: default account handler getters --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira * packaging: bump version to 0.8.1 * Minor fixes (#141) * feat: standardize network config options as functions under network * fix: duplicate imports * fix: read from contract output * chore: bump version * chore: bump version to 0.8.2 * Contract engine improvements (#144) * feat: standardize network config options as functions under network * fix: duplicate imports * version 0.8.2 (#142) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) * test: add build transaction unit tests * chore: merge with develop * test: add build transaction failure tests * refactor: make networkConfig variable private * test: add unit test for fee bump pipeline (#113) * test: add unit tests for classic signature requirements pipeline (#115) * Adjustments to release library as open source 🚀 (#107) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) --------- Co-authored-by: Bruno Nascimento * fix: setoptions op threshold requirement * fix: revoke operation variants threshold calculation * test: add unit tests to classig sign requirements pipeline * refactor: rearrange as per aaa pattern --------- Co-authored-by: Bruno Nascimento * Add unit tests for simulate transaction pipeline (#117) * refactor: eslint adjustments * test: initial simulate transaction unit tests * feat: add assemble transaction sp error * test: complete coverage for simulate transaction pipeline * refactor: clean up comments and adjust imports * Add unit tests for classic transaction pipeline (#118) * test: add unit tests for classic transaction pipeline * refactor: adjust imports * test: add unit tests for soroban transaction pipeline (#119) * test: add unit test for sign transaction pipeline * test: add unit test for submit transaction pipeline * Add unit tests soroban auth (#123) * fix: remove validation from contract engine initialization * style: remove comment * feat: modify account handler mocker payload * test: add unit test to soroban auth pipeline --------- Co-authored-by: Bruno Nascimento * Complete unit test coverage for account handlers (#125) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * Create test-coverage.yml action (#126) * Create test-coverage.yml action * Update test-coverage.yml * Add unit test for base account handler (#127) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * test: add unit tests for base account handler * Add unit test for soroban get transaction pipeline (#124) * refactor: soroban get transaction pipeline constructor * fix: remove old log * test: add unit tests for soroban get transaction pipeline * style: adjust imports * Add unit tests for the classic asset handler (#128) * refactor: adjust outter imports/exports * test: add unit tests for the classic asset handler * feat: remove issuer requirement for classic assets (#129) * refactor: allow for no payload for dah * feat: remove issuer necessity for classic assets to better include native * test: add unit test to soroban token handler (#131) * feat: remove helper classes for account (#132) * feat: remove helper classes for account * refactor: remove unused error for base account * test: complete unit coverage for base account errors * Standardize default network configs and custom (#133) * feat: standardize network config options as functions under network * test: adjust tests for new network config format * feat: require rpc url for default rpc handler to initialize * feat: require horizon url to initialize default horizon handler * test: remove local testing from coverage * feat: remove soroban client * feat: convert horizon load account error to sp error * feat: add allowhttp to network config * test: add unit tests to default horizon handler * test: add default rpc handler unit tests * fix: account changes with network new config format * test: add network configuration unit tests * refactor: allowhttp object Co-authored-by: Caio Teixeira --------- Co-authored-by: Caio Teixeira * packaging: bump version to v0.8.0 * Fix merge issues (#137) * feat: standardize network config options as functions under network * fix: duplicate imports * Update stellar sdk (#139) * Release v0.8.0 (#136) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) * test: add build transaction unit tests * chore: merge with develop * test: add build transaction failure tests * refactor: make networkConfig variable private * test: add unit test for fee bump pipeline (#113) * test: add unit tests for classic signature requirements pipeline (#115) * Adjustments to release library as open source 🚀 (#107) * chore: add jest setup to coverage all files (#101) * refactor: fix circular import * test: contract engine initial structure * Contract Engine unit tests (#103) * refactor: contract engine errors * feat: validate required initialization arguments * test: contract engine initialization workflow * test: complete contract engine main coverage * refactor: update deprecated methods * refactor: contract engine errors (#104) * Update docs and minor adjustments to jsdocs (#105) * fix: missing error CE009 * docs: update jsdoc * docs: update readme for public release * packaging: bump version to 0.7.0 (#108) --------- Co-authored-by: Bruno Nascimento * fix: setoptions op threshold requirement * fix: revoke operation variants threshold calculation * test: add unit tests to classig sign requirements pipeline * refactor: rearrange as per aaa pattern --------- Co-authored-by: Bruno Nascimento * Add unit tests for simulate transaction pipeline (#117) * refactor: eslint adjustments * test: initial simulate transaction unit tests * feat: add assemble transaction sp error * test: complete coverage for simulate transaction pipeline * refactor: clean up comments and adjust imports * Add unit tests for classic transaction pipeline (#118) * test: add unit tests for classic transaction pipeline * refactor: adjust imports * test: add unit tests for soroban transaction pipeline (#119) * test: add unit test for sign transaction pipeline * test: add unit test for submit transaction pipeline * Add unit tests soroban auth (#123) * fix: remove validation from contract engine initialization * style: remove comment * feat: modify account handler mocker payload * test: add unit test to soroban auth pipeline --------- Co-authored-by: Bruno Nascimento * Complete unit test coverage for account handlers (#125) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * Create test-coverage.yml action (#126) * Create test-coverage.yml action * Update test-coverage.yml * Add unit test for base account handler (#127) * test: add unit tests for the default account handler * test: validate error to sign auth entry * feat: add fee bump type to sign payload * test: refactor freighter account handler unit tests * test: add unit tests for base account handler * Add unit test for soroban get transaction pipeline (#124) * refactor: soroban get transaction pipeline constructor * fix: remove old log * test: add unit tests for soroban get transaction pipeline * style: adjust imports * Add unit tests for the classic asset handler (#128) * refactor: adjust outter imports/exports * test: add unit tests for the classic asset handler * feat: remove issuer requirement for classic assets (#129) * refactor: allow for no payload for dah * feat: remove issuer necessity for classic assets to better include native * test: add unit test to soroban token handler (#131) * feat: remove helper classes for account (#132) * feat: remove helper classes for account * refactor: remove unused error for base account * test: complete unit coverage for base account errors * Standardize default network configs and custom (#133) * feat: standardize network config options as functions under network * test: adjust tests for new network config format * feat: require rpc url for default rpc handler to initialize * feat: require horizon url to initialize default horizon handler * test: remove local testing from coverage * feat: remove soroban client * feat: convert horizon load account error to sp error * feat: add allowhttp to network config * test: add unit tests to default horizon handler * test: add default rpc handler unit tests * fix: account changes with network new config format * test: add network configuration unit tests * refactor: allowhttp object Co-authored-by: Caio Teixeira --------- Co-authored-by: Caio Teixeira * packaging: bump version to v0.8.0 * Fix merge issues (#137) * feat: standardize network config options as functions under network * fix: duplicate imports --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira * chore: update stellar sdk * feat: add function to return secret key to default account handler * test: default account handler getters --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira * packaging: bump version to 0.8.1 * Minor fixes (#141) * feat: standardize network config options as functions under network * fix: duplicate imports * fix: read from contract output * chore: bump version * chore: bump version to 0.8.2 --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira * Documentation (#143) * GITBOOK-34: No subject * GITBOOK-35: update issuing your first asset tutorial * GITBOOK-36: update CD tutorial * GITBOOK-37: update profiler plugin * GITBOOK-38: Remove soroban token duplicate link * GITBOOK-39: update soroban token handler * GITBOOK-40: Improve Validation Cloud RPC page * GITBOOK-41: Improve the Welcome Page * GITBOOK-42: Improve Quick Start page * GITBOOK-45: Soroban Auth Pipeline * GITBOOK-47: update general doc --------- Co-authored-by: Fernanda Hahn * feat: remove spec requirement to instantiate contract engine * test: add unit test to spec requirement * feat: export stellar-sdk contract spec --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira Co-authored-by: Fernanda Hahn * chore: bump version to 0.8.3 --------- Co-authored-by: Bruno Nascimento Co-authored-by: Caio Teixeira Co-authored-by: Fernanda Hahn --- package.json | 2 +- .../core/contract-engine/errors.ts | 96 +++++++++++-------- .../core/contract-engine/index.ts | 15 ++- .../core/contract-engine/index.unit.test.ts | 17 ++++ .../core/contract-engine/types.ts | 2 +- src/stellar-plus/core/index.ts | 3 + 6 files changed, 88 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index a5072be3..1529b6ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stellar-plus", - "version": "0.8.2", + "version": "0.8.3", "description": "beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain", "main": "./lib/index.js", "types": "./lib/index.d.ts", diff --git a/src/stellar-plus/core/contract-engine/errors.ts b/src/stellar-plus/core/contract-engine/errors.ts index 40c03a21..d46bd79a 100644 --- a/src/stellar-plus/core/contract-engine/errors.ts +++ b/src/stellar-plus/core/contract-engine/errors.ts @@ -10,49 +10,22 @@ export enum ContractEngineErrorCodes { CE004 = 'CE004', CE005 = 'CE005', CE006 = 'CE006', - CE007 = 'CE007', - CE008 = 'CE008', - CE009 = 'CE009', // CE1 Meta CE101 = 'CE101', CE102 = 'CE102', CE103 = 'CE103', -} - -const missingContractId = (): StellarPlusError => { - return new StellarPlusError({ - code: ContractEngineErrorCodes.CE001, - message: 'Missing contract ID!', - source: 'ContractEngine', - details: - "Missing contract ID! This function requires a contract Id to be defined in this instance. You can either initialize the contract engine with a contract ID or use the 'deploy' function to deploy a new instance of the contract, which will automatically set the new contract Id for this instance.", - }) -} -const missingWasm = (): StellarPlusError => { - return new StellarPlusError({ - code: ContractEngineErrorCodes.CE002, - message: 'Missing wasm!', - source: 'ContractEngine', - details: - 'Missing wasm! This function requires a buffer of the wasm file to be defined in this instance. You need to initialize the contract engine with a wasm file buffer.', - }) -} - -const missingWasmHash = (): StellarPlusError => { - return new StellarPlusError({ - code: ContractEngineErrorCodes.CE003, - message: 'Missing wasm hash!', - source: 'ContractEngine', - details: - "Missing wasm hash! This function requires a wasm hash to be defined in this instance. You can either initialize the contract engine with a wasm hash or use the 'uploadWasm' function to upload a new wasm file, which will automatically set the new wasm hash for this instance.", - }) + // CE2 Missing parameters + CE201 = 'CE201', + CE202 = 'CE202', + CE203 = 'CE203', + CE204 = 'CE204', } const contractIdAlreadySet = (): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE004, + code: ContractEngineErrorCodes.CE001, message: 'Contract ID already set!', source: 'ContractEngine', details: @@ -62,7 +35,7 @@ const contractIdAlreadySet = (): StellarPlusError => { const contractInstanceNotFound = (ledgerEntries: SorobanRpc.Api.GetLedgerEntriesResponse): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE005, + code: ContractEngineErrorCodes.CE002, message: 'Contract instance not found!', source: 'ContractEngine', details: @@ -75,7 +48,7 @@ const contractInstanceMissingLiveUntilLedgerSeq = ( ledgerEntries?: SorobanRpc.Api.GetLedgerEntriesResponse ): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE006, + code: ContractEngineErrorCodes.CE003, message: 'Contract instance missing live_until_ledger_seq!', source: 'ContractEngine', details: @@ -86,7 +59,7 @@ const contractInstanceMissingLiveUntilLedgerSeq = ( const contractCodeNotFound = (ledgerEntries: SorobanRpc.Api.GetLedgerEntriesResponse): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE007, + code: ContractEngineErrorCodes.CE004, message: 'Contract code not found!', source: 'ContractEngine', details: @@ -99,7 +72,7 @@ const contractCodeMissingLiveUntilLedgerSeq = ( ledgerEntries?: SorobanRpc.Api.GetLedgerEntriesResponse ): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE008, + code: ContractEngineErrorCodes.CE005, message: 'Contract code missing live_until_ledger_seq!', source: 'ContractEngine', details: @@ -110,7 +83,7 @@ const contractCodeMissingLiveUntilLedgerSeq = ( const contractEngineClassFailedToInitialize = (): StellarPlusError => { return new StellarPlusError({ - code: ContractEngineErrorCodes.CE009, + code: ContractEngineErrorCodes.CE006, message: 'Contract engine class failed to initialize!', source: 'ContractEngine', details: @@ -150,10 +123,47 @@ const failedToWrapAsset = (error: StellarPlusError): StellarPlusError => { }) } +const missingContractId = (): StellarPlusError => { + return new StellarPlusError({ + code: ContractEngineErrorCodes.CE201, + message: 'Missing contract ID!', + source: 'ContractEngine', + details: + "Missing contract ID! This function requires a contract Id to be defined in this instance. You can either initialize the contract engine with a contract ID or use the 'deploy' function to deploy a new instance of the contract, which will automatically set the new contract Id for this instance.", + }) +} + +const missingWasm = (): StellarPlusError => { + return new StellarPlusError({ + code: ContractEngineErrorCodes.CE202, + message: 'Missing wasm!', + source: 'ContractEngine', + details: + 'Missing wasm! This function requires a buffer of the wasm file to be defined in this instance. You need to initialize the contract engine with a wasm file buffer.', + }) +} + +const missingWasmHash = (): StellarPlusError => { + return new StellarPlusError({ + code: ContractEngineErrorCodes.CE203, + message: 'Missing wasm hash!', + source: 'ContractEngine', + details: + "Missing wasm hash! This function requires a wasm hash to be defined in this instance. You can either initialize the contract engine with a wasm hash or use the 'uploadWasm' function to upload a new wasm file, which will automatically set the new wasm hash for this instance.", + }) +} + +const missingSpec = (): StellarPlusError => { + return new StellarPlusError({ + code: ContractEngineErrorCodes.CE204, + message: 'Missing spec!', + source: 'ContractEngine', + details: + 'Missing spec! This function requires a spec to be defined in this instance. You need to initialize the contract engine with a spec.', + }) +} + export const CEError = { - missingContractId, - missingWasm, - missingWasmHash, contractIdAlreadySet, contractInstanceNotFound, contractInstanceMissingLiveUntilLedgerSeq, @@ -163,4 +173,8 @@ export const CEError = { failedToUploadWasm, failedToDeployContract, failedToWrapAsset, + missingContractId, + missingWasm, + missingWasmHash, + missingSpec, } diff --git a/src/stellar-plus/core/contract-engine/index.ts b/src/stellar-plus/core/contract-engine/index.ts index df8373af..b093d03f 100644 --- a/src/stellar-plus/core/contract-engine/index.ts +++ b/src/stellar-plus/core/contract-engine/index.ts @@ -43,7 +43,7 @@ import { import { SorobanTransactionPipelineOutput } from '../pipelines/soroban-transaction/types' export class ContractEngine { - private spec: ContractSpec + private spec?: ContractSpec private contractId?: string private wasm?: Buffer private wasmHash?: string @@ -245,19 +245,20 @@ export class ContractEngine { simulateOnly: boolean = false ): Promise { this.requireContractId() + this.requireSpec() const { method, methodArgs } = args const txInvocation = { ...(args as SorobanInvokeArgs) } as TransactionInvocation - const encodedArgs = this.spec.funcArgsToScVals(method, methodArgs) + const encodedArgs = this.spec!.funcArgsToScVals(method, methodArgs) // Spec verified in requireSpec const contract = new Contract(this.contractId!) // Contract Id verified in requireContractId const contractCallOperation = contract.call(method, ...encodedArgs) const executionPlugins = [ ...(simulateOnly - ? [new ExtractInvocationOutputFromSimulationPlugin(this.spec, method)] - : [new ExtractInvocationOutputPlugin(this.spec, method)]), + ? [new ExtractInvocationOutputFromSimulationPlugin(this.spec!, method)] + : [new ExtractInvocationOutputPlugin(this.spec!, method)]), ...(txInvocation.executionPlugins || []), ] @@ -412,6 +413,12 @@ export class ContractEngine { } } + private requireSpec(): void { + if (!this.spec) { + throw CEError.missingSpec() + } + } + protected async getContractCodeLedgerEntry(): Promise { this.requireWasmHash() diff --git a/src/stellar-plus/core/contract-engine/index.unit.test.ts b/src/stellar-plus/core/contract-engine/index.unit.test.ts index c5d6d5ac..d88f5c8a 100644 --- a/src/stellar-plus/core/contract-engine/index.unit.test.ts +++ b/src/stellar-plus/core/contract-engine/index.unit.test.ts @@ -150,6 +150,23 @@ describe('ContractEngine', () => { CEError.missingContractId() ) }) + + it('should throw if spec is required but not present', async () => { + const contractEngine = new ContractEngine({ + networkConfig: NETWORK_CONFIG, + contractParameters: { + contractId: MOCKED_CONTRACT_ID, + }, + }) + + await expect(() => + contractEngine.readFromContract({ + method: tokenMethods.name, + methodArgs: {}, + ...MOCKED_TX_INVOCATION, + }) + ).rejects.toThrow(CEError.missingSpec()) + }) }) describe('Initialization workflow', () => { diff --git a/src/stellar-plus/core/contract-engine/types.ts b/src/stellar-plus/core/contract-engine/types.ts index 0250ee90..167dcabc 100644 --- a/src/stellar-plus/core/contract-engine/types.ts +++ b/src/stellar-plus/core/contract-engine/types.ts @@ -10,7 +10,7 @@ import { EnvelopeHeader, FeeBumpHeader, NetworkConfig, TransactionInvocation } f export type ContractEngineConstructorArgs = { networkConfig: NetworkConfig contractParameters: { - spec: ContractSpec + spec?: ContractSpec contractId?: string wasm?: Buffer wasmHash?: string diff --git a/src/stellar-plus/core/index.ts b/src/stellar-plus/core/index.ts index f52d763e..ee67c311 100644 --- a/src/stellar-plus/core/index.ts +++ b/src/stellar-plus/core/index.ts @@ -1,3 +1,5 @@ +import { ContractSpec } from '@stellar/stellar-sdk' + import { ContractEngine } from './contract-engine' import { BuildTransactionPipeline } from './pipelines/build-transaction' import { ClassicSignRequirementsPipeline } from './pipelines/classic-sign-requirements' @@ -22,4 +24,5 @@ export const Core = { SubmitTransaction: SubmitTransactionPipeline, }, ContractEngine: ContractEngine, + ContractSpec, }