diff --git a/src/account/default.ts b/src/account/default.ts index 8d9ecfb3a..9e3551bc2 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -302,7 +302,7 @@ export class Account extends Provider implements AccountInterface { } public async declare( - { contract, classHash: providedClassHash }: DeclareContractPayload, + { contract, classHash: providedClassHash }: DeclareContractPayload, // TODO: compiledClassHash i casm transactionsDetail: InvocationsDetails = {} ): Promise { const nonce = toBigInt(transactionsDetail.nonce ?? (await this.getNonce())); diff --git a/src/provider/sequencer.ts b/src/provider/sequencer.ts index bbd4f0303..dacd5e9bc 100644 --- a/src/provider/sequencer.ts +++ b/src/provider/sequencer.ts @@ -388,14 +388,27 @@ export class SequencerProvider implements ProviderInterface { { senderAddress, contractDefinition, signature }: DeclareContractTransaction, details: InvocationsDetailsWithNonce ): Promise { + if ('program' in contractDefinition) { + return this.fetchEndpoint('add_transaction', undefined, { + type: TransactionType.DECLARE, + contract_class: contractDefinition, + nonce: toHex(details.nonce), + signature: signatureToDecimalArray(signature), + sender_address: senderAddress, + max_fee: toHex(details.maxFee || 0), + version: '0x1', + }).then(this.responseParser.parseDeclareContractResponse); + } + // Cairo 1 return this.fetchEndpoint('add_transaction', undefined, { type: TransactionType.DECLARE, + sender_address: senderAddress, + compiled_class_hash: details.compiledClassHash, contract_class: contractDefinition, nonce: toHex(details.nonce), signature: signatureToDecimalArray(signature), - sender_address: senderAddress, max_fee: toHex(details.maxFee || 0), - version: toHex(details.version || 1), + version: '0x2', }).then(this.responseParser.parseDeclareContractResponse); } diff --git a/src/signer/default.ts b/src/signer/default.ts index 1c8e56fcd..ef9eabb4c 100644 --- a/src/signer/default.ts +++ b/src/signer/default.ts @@ -78,7 +78,15 @@ export class Signer implements SignerInterface { public async signDeclareTransaction( // contractClass: ContractClass, // Should be used once class hash is present in ContractClass - { classHash, senderAddress, chainId, maxFee, version, nonce }: DeclareSignerDetails + { + classHash, + senderAddress, + chainId, + maxFee, + version, + nonce, + compiledClassHash, + }: DeclareSignerDetails ) { const msgHash = calculateDeclareTransactionHash( classHash, @@ -86,7 +94,8 @@ export class Signer implements SignerInterface { version, maxFee, chainId, - nonce + nonce, + compiledClassHash ); return starkCurve.sign(msgHash, this.pk); diff --git a/src/types/api/sequencer.ts b/src/types/api/sequencer.ts index 6a71bf7af..2d1d67866 100644 --- a/src/types/api/sequencer.ts +++ b/src/types/api/sequencer.ts @@ -86,6 +86,7 @@ export namespace Sequencer { nonce: BigNumberish; max_fee?: BigNumberish; version?: BigNumberish; + compiled_class_hash?: string; // v2 declare }; export type DeployTransaction = { diff --git a/src/types/lib.ts b/src/types/lib.ts index 325a4fcfc..4c26ea4f4 100644 --- a/src/types/lib.ts +++ b/src/types/lib.ts @@ -98,7 +98,10 @@ export type InvocationsDetails = { version?: BigNumberish; }; -export type InvocationsDetailsWithNonce = InvocationsDetails & { nonce: BigNumberish }; +export type InvocationsDetailsWithNonce = InvocationsDetails & { + nonce: BigNumberish; + compiledClassHash?: string; +}; export enum TransactionStatus { NOT_RECEIVED = 'NOT_RECEIVED', diff --git a/src/types/signer.ts b/src/types/signer.ts index 00c1b24a7..64dad7fd5 100644 --- a/src/types/signer.ts +++ b/src/types/signer.ts @@ -14,6 +14,7 @@ export interface DeclareSignerDetails { maxFee: BigNumberish; version: BigNumberish; nonce: BigNumberish; + compiledClassHash?: string; } export type DeployAccountSignerDetails = Required & diff --git a/src/utils/hash.ts b/src/utils/hash.ts index 15a85e3fa..78432decb 100644 --- a/src/utils/hash.ts +++ b/src/utils/hash.ts @@ -126,7 +126,8 @@ export function calculateDeclareTransactionHash( version: BigNumberish, maxFee: BigNumberish, chainId: StarknetChainId, - nonce: BigNumberish + nonce: BigNumberish, + compiledClassHash?: string ): string { return calculateTransactionHashCommon( TransactionHashPrefix.DECLARE, @@ -136,7 +137,7 @@ export function calculateDeclareTransactionHash( [classHash], maxFee, chainId, - [nonce] + [nonce, ...(compiledClassHash ? [compiledClassHash] : [])] ); }