From e5bc2601cc47e0dd988050a940540ab83245bda0 Mon Sep 17 00:00:00 2001 From: Jaco Date: Thu, 27 Jan 2022 08:18:51 +0100 Subject: [PATCH] Add support for rpc.contracts.uploadCode (#4508) --- CHANGELOG.md | 1 + packages/rpc-augment/src/augment/jsonrpc.ts | 6 +++++- packages/types-augment/src/registry.ts | 5 ++++- .../src/interfaces/contracts/definitions.ts | 15 +++++++++++++ .../types/src/interfaces/contracts/rpc.ts | 19 +++++++++++++++++ .../types/src/interfaces/contracts/types.ts | 21 +++++++++++++++++++ 6 files changed, 65 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4684c2f7c9..d9b3be8c7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Changes: - Align `Range/RangeInclusive` usage with similar types - Adjust bounty derive, return empty on no `{treasury, bounties}.bounties` - Ensure handling of all `TypeDefInfo` keys in extraction +- Add support for `rpc.contracts.uploadCode` - Update to latest Substrate, Kusama & Polkadot static metadata diff --git a/packages/rpc-augment/src/augment/jsonrpc.ts b/packages/rpc-augment/src/augment/jsonrpc.ts index 0c7a5cc5d1..e83269bef8 100644 --- a/packages/rpc-augment/src/augment/jsonrpc.ts +++ b/packages/rpc-augment/src/augment/jsonrpc.ts @@ -11,7 +11,7 @@ import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy'; import type { BlockHash } from '@polkadot/types/interfaces/chain'; import type { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate'; import type { AuthorityId } from '@polkadot/types/interfaces/consensus'; -import type { ContractCallRequest, ContractExecResult, ContractInstantiateResult, InstantiateRequest } from '@polkadot/types/interfaces/contracts'; +import type { CodeUploadRequest, CodeUploadResult, ContractCallRequest, ContractExecResult, ContractInstantiateResult, InstantiateRequest } from '@polkadot/types/interfaces/contracts'; import type { CreatedBlock } from '@polkadot/types/interfaces/engine'; import type { EthAccount, EthCallRequest, EthFilter, EthFilterChanges, EthLog, EthReceipt, EthRichBlock, EthSubKind, EthSubParams, EthSyncStatus, EthTransaction, EthTransactionRequest, EthWork } from '@polkadot/types/interfaces/eth'; import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics'; @@ -146,6 +146,10 @@ declare module '@polkadot/rpc-core/types/jsonrpc' { * Returns the projected time a given contract will be able to sustain paying its rent **/ rentProjection: AugmentedRpc<(address: AccountId | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>>; + /** + * Upload new code without instantiating a contract from it + **/ + uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>; }; engine: { /** diff --git a/packages/types-augment/src/registry.ts b/packages/types-augment/src/registry.ts index ef7926c21d..b624d32157 100644 --- a/packages/types-augment/src/registry.ts +++ b/packages/types-augment/src/registry.ts @@ -17,7 +17,7 @@ import type { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate'; import type { StatementKind } from '@polkadot/types/interfaces/claims'; import type { CollectiveOrigin, MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective'; import type { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus'; -import type { AliveContractInfo, CodeHash, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultErr, ContractExecResultErrModule, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateReturnValue, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts'; +import type { AliveContractInfo, CodeHash, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultErr, ContractExecResultErrModule, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateReturnValue, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts'; import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi'; import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan'; import type { ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus'; @@ -197,6 +197,9 @@ declare module '@polkadot/types/types/registry' { ClassMetadata: ClassMetadata; CodecHash: CodecHash; CodeHash: CodeHash; + CodeUploadRequest: CodeUploadRequest; + CodeUploadResult: CodeUploadResult; + CodeUploadResultValue: CodeUploadResultValue; CollatorId: CollatorId; CollatorSignature: CollatorSignature; CollectiveOrigin: CollectiveOrigin; diff --git a/packages/types/src/interfaces/contracts/definitions.ts b/packages/types/src/interfaces/contracts/definitions.ts index 1403ea26d1..d09d580042 100644 --- a/packages/types/src/interfaces/contracts/definitions.ts +++ b/packages/types/src/interfaces/contracts/definitions.ts @@ -23,6 +23,21 @@ export default { _reserved: 'Option' }, CodeHash: 'Hash', + CodeUploadRequest: { + origin: 'AccountId', + code: 'Bytes', + storageDepositLimit: 'Option' + }, + CodeUploadResult: { + _enum: { + Ok: 'CodeUploadResultValue', + Err: 'Null' + } + }, + CodeUploadResultValue: { + codeHash: 'CodeHash', + deposit: 'Balance' + }, ContractCallRequest: { origin: 'AccountId', dest: 'AccountId', diff --git a/packages/types/src/interfaces/contracts/rpc.ts b/packages/types/src/interfaces/contracts/rpc.ts index 549856e1a9..095b5b6f0a 100644 --- a/packages/types/src/interfaces/contracts/rpc.ts +++ b/packages/types/src/interfaces/contracts/rpc.ts @@ -39,6 +39,25 @@ export default { ], type: 'ContractInstantiateResult' }, + uploadCode: { + // The RPC here is terribly misnamed - somebody forgot how the RPCs + // are actually done, ie. _ + endpoint: 'contracts_upload_code', + description: 'Upload new code without instantiating a contract from it', + params: [ + { + name: 'uploadRequest', + type: 'CodeUploadRequest' + }, + { + name: 'at', + type: 'BlockHash', + isHstoric: true, + isOptional: true + } + ], + type: 'CodeUploadResult' + }, getStorage: { description: 'Returns the value under a specified storage key in a contract', params: [ diff --git a/packages/types/src/interfaces/contracts/types.ts b/packages/types/src/interfaces/contracts/types.ts index e485902a46..03614498ad 100644 --- a/packages/types/src/interfaces/contracts/types.ts +++ b/packages/types/src/interfaces/contracts/types.ts @@ -20,6 +20,27 @@ export interface AliveContractInfo extends Struct { /** @name CodeHash */ export interface CodeHash extends Hash {} +/** @name CodeUploadRequest */ +export interface CodeUploadRequest extends Struct { + readonly origin: AccountId; + readonly code: Bytes; + readonly storageDepositLimit: Option; +} + +/** @name CodeUploadResult */ +export interface CodeUploadResult extends Enum { + readonly isOk: boolean; + readonly asOk: CodeUploadResultValue; + readonly isErr: boolean; + readonly type: 'Ok' | 'Err'; +} + +/** @name CodeUploadResultValue */ +export interface CodeUploadResultValue extends Struct { + readonly codeHash: CodeHash; + readonly deposit: Balance; +} + /** @name ContractCallFlags */ export interface ContractCallFlags extends Set { readonly isForwardInput: boolean;