From 7859cb1d2b6e4e924f8bb21a1bbb9ada1a46a308 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Thu, 27 Oct 2022 16:10:03 +0530 Subject: [PATCH 01/21] fix: update readme --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index fd8e5c1ab..26e0b3267 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,10 @@ If you consider to contribute to this project please read [CONTRIBUTING.md](http Special thanks to all the [contributors](https://github.com/0xs34n/starknet.js/graphs/contributors), especially to: -Janek ([@janek26](https://github.com/janek26)) and Axel ([@delaaxe](https://github.com/delaaxe)) from [Argent](https://github.com/argentlabs) +Janek ([@janek26](https://github.com/janek26)), Axel ([@delaaxe](https://github.com/delaaxe)) and Dhruv ([@dhruvkelawala](https://github.com/dhruvkelawala)) from [Argent](https://github.com/argentlabs) Miljan ([@MilGard91](https://github.com/MilGard91)) from [Shard Labs](https://shardlabs.io/) -Dhruv ([@dhruvkelawala](https://github.com/dhruvkelawala)) from [Jedi Swap](https://twitter.com/jediswap) - and of course the [StarkWare](https://starkware.co/) team for their dedicated support! This library would not be possible without these rockstars. From 27b402b6eed4c2bec67bfbf7ee27c9636ca4ae2b Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 27 Oct 2022 17:02:32 +0100 Subject: [PATCH 02/21] feat: udc demo --- __tests__/account.test.ts | 16 ++++++++++++++-- src/account/default.ts | 27 ++++++++++++++++++++++++++- src/account/interface.ts | 23 ++++++++++++++++++++++- src/types/lib.ts | 7 +++++++ 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/__tests__/account.test.ts b/__tests__/account.test.ts index 49d079a64..cbede2398 100644 --- a/__tests__/account.test.ts +++ b/__tests__/account.test.ts @@ -23,7 +23,7 @@ describe('deploy and test Wallet', () => { const erc20DeployPayload = getERC20DeployPayload(account.address); - const erc20Response = await provider.deployContract(erc20DeployPayload); + /* const erc20Response = await provider.deployContract(erc20DeployPayload); erc20Address = erc20Response.contract_address; erc20 = new Contract(compiledErc20.abi, erc20Address, provider); @@ -39,7 +39,19 @@ describe('deploy and test Wallet', () => { }); dapp = new Contract(compiledTestDapp.abi, dappResponse.contract_address!, provider); - await provider.waitForTransaction(dappResponse.transaction_hash); + await provider.waitForTransaction(dappResponse.transaction_hash); */ + console.log('ok'); + }); + + test('UDC Deploy', async () => { + const result = await account.deploy({ + classHash: '0x04c2d9baf8dd7c2c57959b5c20ce35cb6b8e9a1f9089da5bf10c9a4986854869', + salt: '123', + unique: true, + constructorCalldata: [], + }); + + console.log('resut: ', result); }); test('estimate fee', async () => { diff --git a/src/account/default.ts b/src/account/default.ts index 0e9092015..2dfe8e2a5 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -16,7 +16,12 @@ import { Signature, } from '../types'; import { EstimateFee, EstimateFeeDetails } from '../types/account'; -import { AllowArray, DeclareContractPayload, DeployAccountContractPayload } from '../types/lib'; +import { + AllowArray, + DeclareContractPayload, + DeployAccountContractPayload, + UniversalDeployerContractPayload, +} from '../types/lib'; import { calculateContractAddressFromHash, transactionVersion } from '../utils/hash'; import { BigNumberish, toBN } from '../utils/number'; import { parseContract } from '../utils/provider'; @@ -228,6 +233,26 @@ export class Account extends Provider implements AccountInterface { ); } + public async deploy( + { classHash, salt, unique, constructorCalldata = [] }: UniversalDeployerContractPayload, + transactionsDetail: InvocationsDetails = {} + ): Promise { + return this.execute( + { + contractAddress: '0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf', + entrypoint: 'deployContract', + calldata: [ + classHash, + salt, + unique === true ? '1' : '0', + // constructorCalldata.toString(), + ], + }, + undefined, + transactionsDetail + ); + } + public async deployAccount( { classHash, diff --git a/src/account/interface.ts b/src/account/interface.ts index 57f074b39..6c2d19dbc 100644 --- a/src/account/interface.ts +++ b/src/account/interface.ts @@ -13,7 +13,12 @@ import { InvokeFunctionResponse, Signature, } from '../types'; -import { AllowArray, DeclareContractPayload, DeployAccountContractPayload } from '../types/lib'; +import { + AllowArray, + DeclareContractPayload, + DeployAccountContractPayload, + UniversalDeployerContractPayload, +} from '../types/lib'; import { BigNumberish } from '../utils/number'; import { TypedData } from '../utils/typedData/types'; @@ -117,6 +122,22 @@ export abstract class AccountInterface extends ProviderInterface { transactionsDetail?: InvocationsDetails ): Promise; + /** + * @param deployContractPayload containing + * - classHash: computed class hash of compiled contract + * - salt: address salt + * - unique: bool if true ensure unique salt + * - calldata: constructor calldata + * @param transactionsDetail Invocation Details containing: + * - optional nonce + * - optional version + * - optional maxFee + */ + public abstract deploy( + deployContractPayload: UniversalDeployerContractPayload, + transactionsDetail?: InvocationsDetails + ): Promise; + /** * Deploy the account on Starknet * diff --git a/src/types/lib.ts b/src/types/lib.ts index 2a65c09d6..bcb982678 100644 --- a/src/types/lib.ts +++ b/src/types/lib.ts @@ -14,6 +14,13 @@ export interface ContractClass { abi?: Abi; } +export type UniversalDeployerContractPayload = { + classHash: BigNumberish; + salt: string; + unique: boolean; + constructorCalldata: RawCalldata; +}; + export type DeployContractPayload = { contract: CompiledContract | string; constructorCalldata?: RawCalldata; From f2e9b1a439908179bad1f4bb0e0632180b7b658f Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 27 Oct 2022 17:22:23 +0100 Subject: [PATCH 03/21] feat: enable custom providers headers option --- src/provider/rpc.ts | 8 ++++++-- src/provider/sequencer.ts | 10 ++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/provider/rpc.ts b/src/provider/rpc.ts index 69ff2c062..78ab43c4b 100644 --- a/src/provider/rpc.ts +++ b/src/provider/rpc.ts @@ -38,6 +38,7 @@ import { Block, BlockIdentifier } from './utils'; export type RpcProviderOptions = { nodeUrl: string; retries?: number; + headers?: object; }; export class RpcProvider implements ProviderInterface { @@ -46,14 +47,17 @@ export class RpcProvider implements ProviderInterface { // from interface public chainId!: StarknetChainId; + public headers: object; + private responseParser = new RPCResponseParser(); private retries: number; constructor(optionsOrProvider: RpcProviderOptions) { - const { nodeUrl, retries } = optionsOrProvider; + const { nodeUrl, retries, headers } = optionsOrProvider; this.nodeUrl = nodeUrl; this.retries = retries || 200; + this.headers = { 'Content-Type': 'application/json', ...headers }; this.getChainId().then((chainId) => { this.chainId = chainId; @@ -64,7 +68,7 @@ export class RpcProvider implements ProviderInterface { return fetch(this.nodeUrl, { method: 'POST', body: stringify({ method, jsonrpc: '2.0', params, id: 0 }), - headers: { 'Content-Type': 'application/json' }, + headers: this.headers, }); } diff --git a/src/provider/sequencer.ts b/src/provider/sequencer.ts index 1615895bb..357a69f2e 100644 --- a/src/provider/sequencer.ts +++ b/src/provider/sequencer.ts @@ -62,6 +62,7 @@ export type SequencerProviderOptions = feederGatewayUrl?: string; gatewayUrl?: string; chainId?: StarknetChainId; + headers?: object; }; export class SequencerProvider implements ProviderInterface { @@ -73,6 +74,8 @@ export class SequencerProvider implements ProviderInterface { public chainId: StarknetChainId; + public headers: object | undefined; + private responseParser = new SequencerAPIResponseParser(); constructor(optionsOrProvider: SequencerProviderOptions = { network: 'goerli-alpha' }) { @@ -93,6 +96,8 @@ export class SequencerProvider implements ProviderInterface { this.chainId = optionsOrProvider.chainId ?? SequencerProvider.getChainIdFromBaseUrl(optionsOrProvider.baseUrl); + + this.headers = optionsOrProvider?.headers; } } @@ -153,13 +158,14 @@ export class SequencerProvider implements ProviderInterface { return `?${queryString}`; } - private getHeaders(method: 'POST' | 'GET'): Record | undefined { + private getHeaders(method: 'POST' | 'GET'): object | undefined { if (method === 'POST') { return { 'Content-Type': 'application/json', + ...this.headers, }; } - return undefined; + return this.headers; } // typesafe fetch From e5d0376dd281b04c486c58786709c42ea1e3a5a7 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 27 Oct 2022 17:43:57 +0100 Subject: [PATCH 04/21] feat: provider docs update --- www/docs/API/provider.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www/docs/API/provider.md b/www/docs/API/provider.md index 37e4ff3b0..3c4c610c1 100644 --- a/www/docs/API/provider.md +++ b/www/docs/API/provider.md @@ -259,10 +259,12 @@ The options for the provider depend on the network. The structure of the options - options.**baseUrl** - Base URL of the network - options.**feederGatewayUrl** - Feeder Gateway Endpoint of the network - options.**gatewayUrl** - Gateway Endpoint +- options.**headers** - [Optional] custom fecth headers or - options.**network** - Either 'mainnet-alpha' or 'goerli-alpha' +- options.**headers** - [Optional] custom fecth headers Example: @@ -396,6 +398,8 @@ Gets the transaction trace from a tx hash. `new starknet.RpcProvider(options)` - options.**nodeUrl** - Starknet RPC node url +- options.**headers** - [Optional] custom fecth headers +- options.**retries** - [Optional] wait for transaction max retries Example: From 81688427d5903d741075fa78dda8785397fda808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Pavi=C4=8Di=C4=87?= Date: Thu, 27 Oct 2022 18:51:35 +0200 Subject: [PATCH 05/21] Apply suggestions from code review --- www/docs/API/provider.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/docs/API/provider.md b/www/docs/API/provider.md index 3c4c610c1..3b21aadcd 100644 --- a/www/docs/API/provider.md +++ b/www/docs/API/provider.md @@ -259,12 +259,12 @@ The options for the provider depend on the network. The structure of the options - options.**baseUrl** - Base URL of the network - options.**feederGatewayUrl** - Feeder Gateway Endpoint of the network - options.**gatewayUrl** - Gateway Endpoint -- options.**headers** - [Optional] custom fecth headers +- options.**headers** - [Optional] custom fetch headers or - options.**network** - Either 'mainnet-alpha' or 'goerli-alpha' -- options.**headers** - [Optional] custom fecth headers +- options.**headers** - [Optional] custom fetch headers Example: @@ -398,7 +398,7 @@ Gets the transaction trace from a tx hash. `new starknet.RpcProvider(options)` - options.**nodeUrl** - Starknet RPC node url -- options.**headers** - [Optional] custom fecth headers +- options.**headers** - [Optional] custom fetch headers - options.**retries** - [Optional] wait for transaction max retries Example: From 9b38cd8a2e23b71a1490c168ae83b64f479d3da9 Mon Sep 17 00:00:00 2001 From: 0xs34n Date: Fri, 28 Oct 2022 09:01:05 -0400 Subject: [PATCH 06/21] fix: ci --- www/docs/API/contract.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/www/docs/API/contract.md b/www/docs/API/contract.md index 7c0f0782d..987c4114e 100644 --- a/www/docs/API/contract.md +++ b/www/docs/API/contract.md @@ -42,37 +42,37 @@ Saves the address of the contract deployed on network that will be used for inte _address_ - address of the contract. -
+

contract.**connect**(providerOrAccount) => void Attaches to new Provider or Account -
+

contract.**deployed**() => _Promise < Contract >_ If the Contract object is the result of a ContractFactory deployment, this method will wait for the transaction to be resolved. -
+

contract.**call**(method, args, options) => _Promise < Result >_ Calls a method on a contract. -
+

contract.**invoke**(method, args, options) => _Promise < InvokeFunctionResponse >_ Invokes a method on a contract. -
+

contract.**estimate**(method, args, options) => _Promise < any >_ Estimates a method on a contract. -
+

contract.**populate**(method, args, options) => _Invocation_ From 5c4452aa2e6b50768438f1117794dce430984ff8 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Fri, 28 Oct 2022 14:21:23 +0100 Subject: [PATCH 07/21] feat: udc working example --- __tests__/account.test.ts | 22 ++++++++++++++-------- src/account/default.ts | 16 +++++++++------- src/constants.ts | 5 +++++ src/types/api/index.ts | 8 +++++--- src/types/lib.ts | 7 ++++++- src/utils/number.ts | 2 ++ 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/__tests__/account.test.ts b/__tests__/account.test.ts index cbede2398..4b2fd8d30 100644 --- a/__tests__/account.test.ts +++ b/__tests__/account.test.ts @@ -23,7 +23,7 @@ describe('deploy and test Wallet', () => { const erc20DeployPayload = getERC20DeployPayload(account.address); - /* const erc20Response = await provider.deployContract(erc20DeployPayload); + const erc20Response = await provider.deployContract(erc20DeployPayload); erc20Address = erc20Response.contract_address; erc20 = new Contract(compiledErc20.abi, erc20Address, provider); @@ -39,19 +39,25 @@ describe('deploy and test Wallet', () => { }); dapp = new Contract(compiledTestDapp.abi, dappResponse.contract_address!, provider); - await provider.waitForTransaction(dappResponse.transaction_hash); */ - console.log('ok'); + await provider.waitForTransaction(dappResponse.transaction_hash); }); test('UDC Deploy', async () => { - const result = await account.deploy({ - classHash: '0x04c2d9baf8dd7c2c57959b5c20ce35cb6b8e9a1f9089da5bf10c9a4986854869', + // only work on testnet + const deployment = await account.deploy({ + classHash: '0x6ad13d6c3f382bdc7d337a3928528e974b76c21153ff25a946d2c4f26ef1c6b', + callData: [ + '0xb3e8b4bd1906e46f4b9ce2d0cbdcf747409ab506469287587b23130a600535', + '0x2dd76e7ad84dbed81c314ffe5e7a7cacfb8f4836f01af4e913f275f89a3de1a', + '0x2', + '0x46a1aa85bb0e68cd29fadbc81791208ddebee17886f075935e5b72f4aa898aa', + '0x46a1aa85bb0e68cd29fadbc81791208ddebee17886f075935e5b72f4aa898aa', + ], salt: '123', - unique: true, - constructorCalldata: [], + unique: false, }); - console.log('resut: ', result); + expect(deployment).toHaveProperty('transaction_hash'); }); test('estimate fee', async () => { diff --git a/src/account/default.ts b/src/account/default.ts index 2dfe8e2a5..a5ea18257 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -1,4 +1,4 @@ -import { ZERO } from '../constants'; +import { UDC, ZERO } from '../constants'; import { ProviderInterface, ProviderOptions } from '../provider'; import { Provider } from '../provider/default'; import { BlockIdentifier } from '../provider/utils'; @@ -23,7 +23,7 @@ import { UniversalDeployerContractPayload, } from '../types/lib'; import { calculateContractAddressFromHash, transactionVersion } from '../utils/hash'; -import { BigNumberish, toBN } from '../utils/number'; +import { BigNumberish, toBN, toCairoBool } from '../utils/number'; import { parseContract } from '../utils/provider'; import { compileCalldata, estimatedFeeToMaxFee } from '../utils/stark'; import { fromCallsToExecuteCalldata } from '../utils/transaction'; @@ -234,18 +234,20 @@ export class Account extends Provider implements AccountInterface { } public async deploy( - { classHash, salt, unique, constructorCalldata = [] }: UniversalDeployerContractPayload, + { classHash, salt, unique = true, callData = [] }: UniversalDeployerContractPayload, transactionsDetail: InvocationsDetails = {} ): Promise { + const compiledCallData = compileCalldata(callData); return this.execute( { - contractAddress: '0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf', - entrypoint: 'deployContract', + contractAddress: UDC.ADDRESS, + entrypoint: UDC.ENTRYPOINT, calldata: [ classHash, salt, - unique === true ? '1' : '0', - // constructorCalldata.toString(), + toCairoBool(unique), + compiledCallData.length, + ...compiledCallData, ], }, undefined, diff --git a/src/constants.ts b/src/constants.ts index 763fd34f2..b0015018c 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -20,6 +20,11 @@ export enum TransactionHashPrefix { L1_HANDLER = '0x6c315f68616e646c6572', // encodeShortString('l1_handler'), } +export const UDC = { + ADDRESS: '0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf', + ENTRYPOINT: 'deployContract', +}; + /** * The following is taken from https://github.com/starkware-libs/starkex-resources/blob/master/crypto/starkware/crypto/signature/pedersen_params.json but converted to hex, because JS is very bad handling big integers by default * Please do not edit until the JSON changes. diff --git a/src/types/api/index.ts b/src/types/api/index.ts index 17c034e1e..7f828965e 100644 --- a/src/types/api/index.ts +++ b/src/types/api/index.ts @@ -1,9 +1,11 @@ import { BigNumberish } from '../../utils/number'; import { Signature } from '../lib'; -export type RawArgs = { - [inputName: string]: string | string[] | { type: 'struct'; [k: string]: BigNumberish }; -}; +export type RawArgs = + | { + [inputName: string]: string | string[] | { type: 'struct'; [k: string]: BigNumberish }; + } + | string[]; export type Calldata = string[]; diff --git a/src/types/lib.ts b/src/types/lib.ts index bcb982678..8842d8636 100644 --- a/src/types/lib.ts +++ b/src/types/lib.ts @@ -7,6 +7,11 @@ export type KeyPair = EC.KeyPair; export type Signature = string[]; export type RawCalldata = BigNumberish[]; export type AllowArray = T | T[]; +export type RawArgs = + | { + [inputName: string]: string | string[] | { type: 'struct'; [k: string]: BigNumberish }; + } + | string[]; export interface ContractClass { program: CompressedProgram; @@ -18,7 +23,7 @@ export type UniversalDeployerContractPayload = { classHash: BigNumberish; salt: string; unique: boolean; - constructorCalldata: RawCalldata; + callData: RawArgs; }; export type DeployContractPayload = { diff --git a/src/utils/number.ts b/src/utils/number.ts index 125bc555a..703baf7be 100644 --- a/src/utils/number.ts +++ b/src/utils/number.ts @@ -88,3 +88,5 @@ export function getHexString(value: string) { export function getHexStringArray(value: Array) { return value.map((el) => getHexString(el)); } + +export const toCairoBool = (value: boolean): string => (+value).toString(); From b65dc651bbd86708d4f88b7445813dab7dfea639 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Mon, 31 Oct 2022 12:07:05 +0530 Subject: [PATCH 08/21] fix: remove multiple RawArgs declaration --- src/types/api/index.ts | 6 ------ src/types/index.ts | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/types/api/index.ts b/src/types/api/index.ts index 7f828965e..51aa32449 100644 --- a/src/types/api/index.ts +++ b/src/types/api/index.ts @@ -1,12 +1,6 @@ import { BigNumberish } from '../../utils/number'; import { Signature } from '../lib'; -export type RawArgs = - | { - [inputName: string]: string | string[] | { type: 'struct'; [k: string]: BigNumberish }; - } - | string[]; - export type Calldata = string[]; export type Overrides = { diff --git a/src/types/index.ts b/src/types/index.ts index 450cfb3d0..dcb837eb9 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,6 +1,6 @@ export * from './lib'; export * as api from './api'; -export { Calldata, Overrides, RawArgs } from './api'; +export { Calldata, Overrides } from './api'; export * from './signer'; export * from './contract'; export * from './account'; From d96cc531786738de7d8ec285ccdaa39e76a94de3 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Mon, 31 Oct 2022 14:19:38 +0530 Subject: [PATCH 09/21] feat: fix and add proper UDC tests --- __tests__/account.test.ts | 20 +------------------- __tests__/udc.test.ts | 30 ++++++++++++++++++++++++++++++ src/account/default.ts | 10 ++++++++-- src/constants.ts | 1 + src/types/lib.ts | 3 ++- 5 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 __tests__/udc.test.ts diff --git a/__tests__/account.test.ts b/__tests__/account.test.ts index 4b2fd8d30..fab2557b8 100644 --- a/__tests__/account.test.ts +++ b/__tests__/account.test.ts @@ -42,24 +42,6 @@ describe('deploy and test Wallet', () => { await provider.waitForTransaction(dappResponse.transaction_hash); }); - test('UDC Deploy', async () => { - // only work on testnet - const deployment = await account.deploy({ - classHash: '0x6ad13d6c3f382bdc7d337a3928528e974b76c21153ff25a946d2c4f26ef1c6b', - callData: [ - '0xb3e8b4bd1906e46f4b9ce2d0cbdcf747409ab506469287587b23130a600535', - '0x2dd76e7ad84dbed81c314ffe5e7a7cacfb8f4836f01af4e913f275f89a3de1a', - '0x2', - '0x46a1aa85bb0e68cd29fadbc81791208ddebee17886f075935e5b72f4aa898aa', - '0x46a1aa85bb0e68cd29fadbc81791208ddebee17886f075935e5b72f4aa898aa', - ], - salt: '123', - unique: false, - }); - - expect(deployment).toHaveProperty('transaction_hash'); - }); - test('estimate fee', async () => { const { overall_fee } = await account.estimateInvokeFee({ contractAddress: erc20Address, @@ -163,7 +145,7 @@ describe('deploy and test Wallet', () => { expect(res).toHaveProperty('overall_fee'); }); - test('Declare Account contract', async () => { + test('Declare ERC20 contract', async () => { const declareTx = await account.declare({ contract: compiledErc20, classHash: '0x54328a1075b8820eb43caf0caa233923148c983742402dcfc38541dd843d01a', diff --git a/__tests__/udc.test.ts b/__tests__/udc.test.ts new file mode 100644 index 000000000..665008849 --- /dev/null +++ b/__tests__/udc.test.ts @@ -0,0 +1,30 @@ +import { encodeShortString } from '../src/utils/shortString'; +import { IS_DEVNET, compiledErc20, getTestAccount, getTestProvider } from './fixtures'; + +describe('Declare and UDC Deploy Flow', () => { + const provider = getTestProvider(); + const account = getTestAccount(provider); + const erc20ClassHash = '0x54328a1075b8820eb43caf0caa233923148c983742402dcfc38541dd843d01a'; + + test('ERC20 Declare', async () => { + const declareTx = await account.declare({ + classHash: erc20ClassHash, + contract: compiledErc20, + }); + + expect(declareTx).toHaveProperty('class_hash'); + expect(declareTx.class_hash).toEqual(erc20ClassHash); + }); + + test('UDC Deploy', async () => { + const deployment = await account.deploy({ + classHash: erc20ClassHash, + callData: [encodeShortString('Token'), encodeShortString('ERC20'), account.address], + salt: '123', + unique: true, // Using true here so as not to clash with normal erc20 deploy in account and provider test + isDevnet: IS_DEVNET, + }); + + expect(deployment).toHaveProperty('transaction_hash'); + }); +}); diff --git a/src/account/default.ts b/src/account/default.ts index a5ea18257..36dac65db 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -234,13 +234,19 @@ export class Account extends Provider implements AccountInterface { } public async deploy( - { classHash, salt, unique = true, callData = [] }: UniversalDeployerContractPayload, + { + classHash, + salt, + unique = true, + callData = [], + isDevnet = false, + }: UniversalDeployerContractPayload, transactionsDetail: InvocationsDetails = {} ): Promise { const compiledCallData = compileCalldata(callData); return this.execute( { - contractAddress: UDC.ADDRESS, + contractAddress: isDevnet ? UDC.ADDRESS_DEVNET : UDC.ADDRESS, entrypoint: UDC.ENTRYPOINT, calldata: [ classHash, diff --git a/src/constants.ts b/src/constants.ts index b0015018c..c0e0118c6 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -23,6 +23,7 @@ export enum TransactionHashPrefix { export const UDC = { ADDRESS: '0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf', ENTRYPOINT: 'deployContract', + ADDRESS_DEVNET: '0x25fcb74260022bd8ed7e8d542408941826b53345e478b8303d6f31744838a36', }; /** diff --git a/src/types/lib.ts b/src/types/lib.ts index 8842d8636..bb42dca58 100644 --- a/src/types/lib.ts +++ b/src/types/lib.ts @@ -23,7 +23,8 @@ export type UniversalDeployerContractPayload = { classHash: BigNumberish; salt: string; unique: boolean; - callData: RawArgs; + callData?: RawArgs; + isDevnet?: boolean; }; export type DeployContractPayload = { From 1f8711d51dc69ff3934880c3a79cfc37009528a4 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Mon, 31 Oct 2022 14:27:57 +0530 Subject: [PATCH 10/21] chore: update devnet image --- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6da533229..f56ed7bea 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -26,7 +26,7 @@ jobs: services: devnet: - image: shardlabs/starknet-devnet:0.3.4-seed0 + image: shardlabs/starknet-devnet:0.3.5-seed0 ports: - 5050:5050 env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 341cf746f..923cf896c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: services: devnet: - image: shardlabs/starknet-devnet:0.3.4-seed0 + image: shardlabs/starknet-devnet:0.3.5-seed0 ports: - 5050:5050 env: From 67fe081a24ca9eb64669ed9b0c2726898c68a34c Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Tue, 1 Nov 2022 15:11:16 +0530 Subject: [PATCH 11/21] fix: return type and rename calldata --- __tests__/udc.test.ts | 6 +++++- src/account/default.ts | 10 +++++----- src/types/lib.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/__tests__/udc.test.ts b/__tests__/udc.test.ts index 665008849..487d28e4c 100644 --- a/__tests__/udc.test.ts +++ b/__tests__/udc.test.ts @@ -19,7 +19,11 @@ describe('Declare and UDC Deploy Flow', () => { test('UDC Deploy', async () => { const deployment = await account.deploy({ classHash: erc20ClassHash, - callData: [encodeShortString('Token'), encodeShortString('ERC20'), account.address], + constructorCalldata: [ + encodeShortString('Token'), + encodeShortString('ERC20'), + account.address, + ], salt: '123', unique: true, // Using true here so as not to clash with normal erc20 deploy in account and provider test isDevnet: IS_DEVNET, diff --git a/src/account/default.ts b/src/account/default.ts index 36dac65db..a8bce285e 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -238,12 +238,12 @@ export class Account extends Provider implements AccountInterface { classHash, salt, unique = true, - callData = [], + constructorCalldata = [], isDevnet = false, }: UniversalDeployerContractPayload, transactionsDetail: InvocationsDetails = {} - ): Promise { - const compiledCallData = compileCalldata(callData); + ): Promise { + const compiledConstructorCallData = compileCalldata(constructorCalldata); return this.execute( { contractAddress: isDevnet ? UDC.ADDRESS_DEVNET : UDC.ADDRESS, @@ -252,8 +252,8 @@ export class Account extends Provider implements AccountInterface { classHash, salt, toCairoBool(unique), - compiledCallData.length, - ...compiledCallData, + compiledConstructorCallData.length, + ...compiledConstructorCallData, ], }, undefined, diff --git a/src/types/lib.ts b/src/types/lib.ts index bb42dca58..2e10ce4fc 100644 --- a/src/types/lib.ts +++ b/src/types/lib.ts @@ -23,7 +23,7 @@ export type UniversalDeployerContractPayload = { classHash: BigNumberish; salt: string; unique: boolean; - callData?: RawArgs; + constructorCalldata?: RawArgs; isDevnet?: boolean; }; From 4b99f4a7b09a03990e2ba9ea00de2d0206f93ce0 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Tue, 1 Nov 2022 15:28:20 +0530 Subject: [PATCH 12/21] feat: add multicall support --- src/account/default.ts | 29 ++++++++++++++++++----------- src/account/interface.ts | 2 ++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/account/default.ts b/src/account/default.ts index a8bce285e..2dad91b9f 100644 --- a/src/account/default.ts +++ b/src/account/default.ts @@ -241,21 +241,28 @@ export class Account extends Provider implements AccountInterface { constructorCalldata = [], isDevnet = false, }: UniversalDeployerContractPayload, + additionalCalls: AllowArray = [], // support multicall transactionsDetail: InvocationsDetails = {} ): Promise { const compiledConstructorCallData = compileCalldata(constructorCalldata); + + const callsArray = Array.isArray(additionalCalls) ? additionalCalls : [additionalCalls]; + return this.execute( - { - contractAddress: isDevnet ? UDC.ADDRESS_DEVNET : UDC.ADDRESS, - entrypoint: UDC.ENTRYPOINT, - calldata: [ - classHash, - salt, - toCairoBool(unique), - compiledConstructorCallData.length, - ...compiledConstructorCallData, - ], - }, + [ + { + contractAddress: isDevnet ? UDC.ADDRESS_DEVNET : UDC.ADDRESS, + entrypoint: UDC.ENTRYPOINT, + calldata: [ + classHash, + salt, + toCairoBool(unique), + compiledConstructorCallData.length, + ...compiledConstructorCallData, + ], + }, + ...callsArray, + ], undefined, transactionsDetail ); diff --git a/src/account/interface.ts b/src/account/interface.ts index 6c2d19dbc..d439e350e 100644 --- a/src/account/interface.ts +++ b/src/account/interface.ts @@ -128,6 +128,7 @@ export abstract class AccountInterface extends ProviderInterface { * - salt: address salt * - unique: bool if true ensure unique salt * - calldata: constructor calldata + * @param additionalCalls - optional additional calls array to support multicall * @param transactionsDetail Invocation Details containing: * - optional nonce * - optional version @@ -135,6 +136,7 @@ export abstract class AccountInterface extends ProviderInterface { */ public abstract deploy( deployContractPayload: UniversalDeployerContractPayload, + additionalCalls?: AllowArray, transactionsDetail?: InvocationsDetails ): Promise; From 6a663d492751b0cd8493af6d4ee9a5cf5524ed19 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Tue, 1 Nov 2022 15:29:44 +0530 Subject: [PATCH 13/21] fix: deploy return type in interface --- src/account/interface.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/account/interface.ts b/src/account/interface.ts index d439e350e..fb92900ca 100644 --- a/src/account/interface.ts +++ b/src/account/interface.ts @@ -138,7 +138,7 @@ export abstract class AccountInterface extends ProviderInterface { deployContractPayload: UniversalDeployerContractPayload, additionalCalls?: AllowArray, transactionsDetail?: InvocationsDetails - ): Promise; + ): Promise; /** * Deploy the account on Starknet From 8a054d0ceb312efc0b6d303cad73b9bb39ba4304 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Tue, 8 Nov 2022 13:35:06 +0100 Subject: [PATCH 14/21] feat: testnet2 --- __tests__/fixtures.ts | 2 +- src/provider/sequencer.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/__tests__/fixtures.ts b/__tests__/fixtures.ts index 97c18ca58..b064ffa5a 100644 --- a/__tests__/fixtures.ts +++ b/__tests__/fixtures.ts @@ -28,7 +28,7 @@ const IS_RPC_DEVNET = Boolean( ); const IS_SEQUENCER = !IS_RPC; const IS_SEQUENCER_DEVNET = !BASE_URL.includes('starknet.io'); -export const IS_SEQUENCER_GOERLI = BASE_URL === 'https://alpha4.starknet.io'; +export const IS_SEQUENCER_GOERLI = BASE_URL === 'https://alpha4-2.starknet.io'; export const IS_DEVNET = IS_SEQUENCER ? IS_SEQUENCER_DEVNET : IS_RPC_DEVNET; export const getTestProvider = () => { diff --git a/src/provider/sequencer.ts b/src/provider/sequencer.ts index 357a69f2e..c62933ad0 100644 --- a/src/provider/sequencer.ts +++ b/src/provider/sequencer.ts @@ -44,7 +44,7 @@ import { GatewayError, HttpError } from './errors'; import { ProviderInterface } from './interface'; import { Block, BlockIdentifier } from './utils'; -type NetworkName = 'mainnet-alpha' | 'goerli-alpha'; +type NetworkName = 'mainnet-alpha' | 'goerli-alpha' | 'goerli-alpha-2'; function isEmptyQueryObject(obj?: Record): obj is undefined { return ( @@ -106,6 +106,9 @@ export class SequencerProvider implements ProviderInterface { case 'mainnet-alpha': return 'https://alpha-mainnet.starknet.io'; case 'goerli-alpha': + return 'https://alpha4.starknet.io'; + case 'goerli-alpha-2': + return 'https://alpha4-2.starknet.io'; default: return 'https://alpha4.starknet.io'; } From 5b7df2d8efae637705fd9e9fa8e9a09fb43ec905 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Tue, 8 Nov 2022 16:08:29 +0100 Subject: [PATCH 15/21] Update release.yml --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 923cf896c..f5d5f1f64 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release +goername: Release on: push: branches: @@ -33,7 +33,7 @@ jobs: - name: sequencer-test TEST_PROVIDER_BASE_URL: http://127.0.0.1:5050/ - name: sequencer-goerli - TEST_PROVIDER_BASE_URL: https://alpha4.starknet.io + TEST_PROVIDER_BASE_URL: https://alpha4-2.starknet.io ENABLE_TEST_ACCOUNT_PRIVATE_KEY: true ENABLE_TEST_ACCOUNT_ADDRESS: true - name: rpc-goerli From 9dda5f9d59b98ab7cd4e4786fc94735a27557213 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Tue, 8 Nov 2022 16:16:10 +0100 Subject: [PATCH 16/21] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5d5f1f64..9aee7f6b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -goername: Release +name: Release on: push: branches: From 40fdf296aa2d0bee8eeb0486c80ec7b3d8cf71f8 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Wed, 9 Nov 2022 15:12:14 +0100 Subject: [PATCH 17/21] test: defaultProvider clenup --- __tests__/defaultProvider.test.ts | 295 +++++++++--------------------- __tests__/udc.test.ts | 1 - src/provider/rpc.ts | 2 +- 3 files changed, 86 insertions(+), 212 deletions(-) diff --git a/__tests__/defaultProvider.test.ts b/__tests__/defaultProvider.test.ts index 8d86daa13..a6de6627c 100644 --- a/__tests__/defaultProvider.test.ts +++ b/__tests__/defaultProvider.test.ts @@ -1,11 +1,6 @@ -import { BlockNumber, DeployContractResponse, GetBlockResponse, stark } from '../src'; +import { BlockNumber, GetBlockResponse, stark } from '../src'; import { toBN } from '../src/utils/number'; -import { - compiledOpenZeppelinAccount, - describeIfNotDevnet, - getERC20DeployPayload, - getTestProvider, -} from './fixtures'; +import { getERC20DeployPayload, getTestProvider } from './fixtures'; const { compileCalldata } = stark; @@ -36,27 +31,47 @@ describe('defaultProvider', () => { }); describe('endpoints', () => { - test(`getBlock(blockHash=undefined, blockNumber=${exampleBlockNumber})`, () => { - return expect(testProvider.getBlock(exampleBlockNumber)).resolves.not.toThrow(); + test('deployContract()', () => { + expect(exampleContractAddress).toBeTruthy(); + expect(exampleTransactionHash).toBeTruthy(); }); - test(`getBlock(blockHash=${exampleBlockHash}, blockNumber=undefined)`, () => { - return expect(testProvider.getBlock(exampleBlockHash)).resolves.not.toThrow(); - }); - - test('getBlock(blockIdentifier=latest)', async () => { - expect(exampleBlock).not.toBeNull(); - - const { block_number, timestamp } = exampleBlock; + describe('getBlock', () => { + test('getBlock(blockIdentifier=latest)', async () => { + expect(exampleBlock).not.toBeNull(); + const { block_number, timestamp } = exampleBlock; + expect(typeof block_number).toEqual('number'); + return expect(typeof timestamp).toEqual('number'); + }); - expect(typeof block_number).toEqual('number'); + test(`getBlock(blockHash=undefined, blockNumber=${exampleBlockNumber})`, async () => { + const block = await testProvider.getBlock(exampleBlockNumber); + expect(block).toHaveProperty('block_hash'); + expect(block).toHaveProperty('parent_hash'); + expect(block).toHaveProperty('block_number'); + expect(block).toHaveProperty('status'); + expect(block).toHaveProperty('new_root'); + expect(block).toHaveProperty('timestamp'); + expect(block).toHaveProperty('transactions'); + expect(Array.isArray(block.transactions)).toBe(true); + }); - return expect(typeof timestamp).toEqual('number'); - }); + test(`getBlock(blockHash=${exampleBlockHash}, blockNumber=undefined)`, async () => { + const block = await testProvider.getBlock(exampleBlockHash); + expect(block).toHaveProperty('block_hash'); + expect(block).toHaveProperty('parent_hash'); + expect(block).toHaveProperty('block_number'); + expect(block).toHaveProperty('status'); + expect(block).toHaveProperty('new_root'); + expect(block).toHaveProperty('timestamp'); + expect(block).toHaveProperty('transactions'); + expect(Array.isArray(block.transactions)).toBe(true); + }); - test('getBlock() -> { blockNumber }', async () => { - const block = await testProvider.getBlock('latest'); - return expect(block).toHaveProperty('block_number'); + test('getBlock() -> { blockNumber }', async () => { + const block = await testProvider.getBlock('latest'); + return expect(block).toHaveProperty('block_number'); + }); }); test('getNonce()', async () => { @@ -64,6 +79,13 @@ describe('defaultProvider', () => { return expect(nonce).toEqual('0x0'); }); + test('getClassAt(contractAddress, blockNumber="latest")', async () => { + const classResponse = await testProvider.getClassAt(exampleContractAddress); + + expect(classResponse).toHaveProperty('program'); + expect(classResponse).toHaveProperty('entry_points_by_type'); + }); + describe('getStorageAt', () => { test('with "key" type of number', () => { return expect(testProvider.getStorageAt(exampleContractAddress, 0)).resolves.not.toThrow(); @@ -82,7 +104,7 @@ describe('defaultProvider', () => { }); }); - test('getTransaction() - successful transaction', async () => { + test('getTransaction() - successful deploy transaction', async () => { const transaction = await testProvider.getTransaction(exampleTransactionHash); expect(transaction).toHaveProperty('transaction_hash'); @@ -91,198 +113,51 @@ describe('defaultProvider', () => { test('getTransactionReceipt() - successful transaction', async () => { const transactionReceipt = await testProvider.getTransactionReceipt(exampleTransactionHash); - return expect(transactionReceipt).toHaveProperty('actual_fee'); + expect(transactionReceipt).toHaveProperty('actual_fee'); + expect(transactionReceipt).toHaveProperty('transaction_hash'); + expect(transactionReceipt).toHaveProperty('status'); + expect(transactionReceipt).toHaveProperty('actual_fee'); }); - test('callContract()', () => { - return expect( - testProvider.callContract({ - contractAddress: exampleContractAddress, - entrypoint: 'balanceOf', - calldata: compileCalldata({ - user: '0x9ff64f4ab0e1fe88df4465ade98d1ea99d5732761c39279b8e1374fa943e9b', - }), - }) - ).resolves.not.toThrow(); - }); - - test('callContract() - gateway error', async () => { - return expect( - testProvider.callContract({ - contractAddress: exampleContractAddress, - entrypoint: 'non_existent_entrypoint', - calldata: compileCalldata({ - user: '0xdeadbeef', - }), - }) - ).rejects.toThrowError(); - }); - }); - - describe('addTransaction()', () => { - test('deployContract()', async () => { - const response = await testProvider.deployContract({ - contract: compiledOpenZeppelinAccount, - }); - - expect(response.transaction_hash).toBeDefined(); - expect(response.contract_address).toBeDefined(); - }); - }); - - describeIfNotDevnet('Provider', () => { - const provider = getTestProvider(); - let latestBlock; - describe(`Provider methods if not devnet`, () => { - describe('getBlock', () => { - test('getBlock by tag latest', async () => { - latestBlock = await provider.getBlock('latest'); - expect(latestBlock).toHaveProperty('block_hash'); - expect(latestBlock).toHaveProperty('parent_hash'); - expect(latestBlock).toHaveProperty('block_number'); - expect(latestBlock).toHaveProperty('status'); - expect(latestBlock).toHaveProperty('new_root'); - expect(latestBlock).toHaveProperty('timestamp'); - expect(latestBlock).toHaveProperty('transactions'); - expect(Array.isArray(latestBlock.transactions)).toBe(true); - }); - - test('getBlock by Hash', async () => { - const block = await provider.getBlock(latestBlock.block_hash); - expect(block).toHaveProperty('block_hash'); - expect(block).toHaveProperty('parent_hash'); - expect(block).toHaveProperty('block_number'); - expect(block).toHaveProperty('status'); - expect(block).toHaveProperty('new_root'); - expect(block).toHaveProperty('timestamp'); - expect(block).toHaveProperty('transactions'); - expect(Array.isArray(block.transactions)).toBe(true); - }); - - test('getBlock by Number', async () => { - const block = await provider.getBlock(latestBlock.block_number); - expect(block).toHaveProperty('block_hash'); - expect(block).toHaveProperty('parent_hash'); - expect(block).toHaveProperty('block_number'); - expect(block).toHaveProperty('status'); - expect(block).toHaveProperty('new_root'); - expect(block).toHaveProperty('timestamp'); - expect(block).toHaveProperty('transactions'); - expect(Array.isArray(block.transactions)).toBe(true); - }); - }); - - describe('getStorageAt', () => { - test('pending', async () => { - const storage = await provider.getStorageAt( - '0x01d1f307c073bb786a66e6e042ec2a9bdc385a3373bb3738d95b966d5ce56166', - '0' - ); - expect(typeof storage).toBe('string'); - }); - - test('Block Hash 0x7104702055c2a5773a870ceada9552ec659d69c18053b14078983f07527dea8', async () => { - const storage = await provider.getStorageAt( - '0x01d1f307c073bb786a66e6e042ec2a9bdc385a3373bb3738d95b966d5ce56166', - '0', - '0x7225762c7ff5e7e5f0867f0a8e73594df4f44f05a65375339a76398e8ae3e64' - ); - expect(typeof storage).toBe('string'); - }); - }); - - describe('getTransaction', () => { - test('Deploy Transaction Hash 0x37013e1cb9c133e6fe51b4b371b76b317a480f56d80576730754c1662582348', async () => { - const transaction = await provider.getTransaction( - '0x37013e1cb9c133e6fe51b4b371b76b317a480f56d80576730754c1662582348' - ); - - expect(transaction.transaction_hash).toBeTruthy(); - expect(transaction.contract_address).toBeTruthy(); - }); - - test('Invoke Transaction Hash 0x2a56c636f45761c99a67ecdf0f185a6d5fe5239924ed9a4886fddbfaf3227b', async () => { - const transaction = await provider.getTransaction( - '0x2a56c636f45761c99a67ecdf0f185a6d5fe5239924ed9a4886fddbfaf3227b' - ); - - expect(transaction.transaction_hash).toBeTruthy(); - expect(transaction.contract_address).toBeTruthy(); - expect(Array.isArray(transaction.calldata)).toBe(true); - // expect(transaction.entry_point_selector).toBeTruthy(); - expect(Array.isArray(transaction.signature)).toBe(true); - expect(transaction.max_fee).toBeTruthy(); - }); - - test('Declare Transaction Hash 0x79b130f2e808db6ab4b83f0182f016a128d73752b849e5b0221c2b3a35a87ea', async () => { - const transaction = await provider.getTransaction( - '0x79b130f2e808db6ab4b83f0182f016a128d73752b849e5b0221c2b3a35a87ea' - ); - - expect(transaction.max_fee).toBeTruthy(); - expect(transaction.transaction_hash).toBeTruthy(); - expect(transaction).toHaveProperty('nonce'); - expect(transaction).toHaveProperty('version'); - }); + describe('callContract()', () => { + test('callContract()', () => { + return expect( + testProvider.callContract({ + contractAddress: exampleContractAddress, + entrypoint: 'balanceOf', + calldata: compileCalldata({ + user: '0x9ff64f4ab0e1fe88df4465ade98d1ea99d5732761c39279b8e1374fa943e9b', + }), + }) + ).resolves.not.toThrow(); }); - describe('getTransactionReceipt', () => { - test('Transaction Hash 0x37013e1cb9c133e6fe51b4b371b76b317a480f56d80576730754c1662582348', async () => { - const receipt = await provider.getTransactionReceipt( - '0x37013e1cb9c133e6fe51b4b371b76b317a480f56d80576730754c1662582348' - ); - expect(receipt).toHaveProperty('transaction_hash'); - expect(receipt).toHaveProperty('status'); - expect(receipt).toHaveProperty('actual_fee'); - }); + test('callContract() - user wallet', () => { + return expect( + testProvider + .callContract({ + contractAddress: exampleContractAddress, + entrypoint: 'balanceOf', + calldata: compileCalldata({ + user: wallet, + }), + }) + .then((res) => { + expect(Array.isArray(res.result)).toBe(true); + }) + ).resolves.not.toThrow(); }); - describe('Contract methods', () => { - let contractAddress: string; - let deployResponse: DeployContractResponse; - let blockNumber: BlockNumber; - - beforeAll(async () => { - const erc20DeployPayload = getERC20DeployPayload(wallet); - deployResponse = await provider.deployContract(erc20DeployPayload); - contractAddress = deployResponse.contract_address; - await provider.waitForTransaction(deployResponse.transaction_hash); - ({ block_number: blockNumber } = await provider.getBlock('latest')); - }); - - describe('deployContract', () => { - test('response', () => { - expect(deployResponse.contract_address).toBeTruthy(); - expect(deployResponse.transaction_hash).toBeTruthy(); - }); - }); - - describe('getClassAt', () => { - test('response', async () => { - const classResponse = await provider.getClassAt(contractAddress, blockNumber); - - expect(classResponse).toHaveProperty('program'); - expect(classResponse).toHaveProperty('entry_points_by_type'); - }); - }); - - describe('callContract', () => { - test('result', () => { - return expect( - provider - .callContract({ - contractAddress: deployResponse.contract_address, - entrypoint: 'balanceOf', - calldata: compileCalldata({ - user: wallet, - }), - }) - .then((res) => { - expect(Array.isArray(res.result)).toBe(true); - }) - ).resolves.not.toThrow(); - }); - }); + test('callContract() - gateway error', async () => { + return expect( + testProvider.callContract({ + contractAddress: exampleContractAddress, + entrypoint: 'non_existent_entrypoint', + calldata: compileCalldata({ + user: '0xdeadbeef', + }), + }) + ).rejects.toThrowError(); }); }); }); diff --git a/__tests__/udc.test.ts b/__tests__/udc.test.ts index 487d28e4c..298a2220a 100644 --- a/__tests__/udc.test.ts +++ b/__tests__/udc.test.ts @@ -28,7 +28,6 @@ describe('Declare and UDC Deploy Flow', () => { unique: true, // Using true here so as not to clash with normal erc20 deploy in account and provider test isDevnet: IS_DEVNET, }); - expect(deployment).toHaveProperty('transaction_hash'); }); }); diff --git a/src/provider/rpc.ts b/src/provider/rpc.ts index 78ab43c4b..f5633b7ef 100644 --- a/src/provider/rpc.ts +++ b/src/provider/rpc.ts @@ -200,7 +200,7 @@ export class RpcProvider implements ProviderInterface { public async getClassAt( contractAddress: string, - blockIdentifier: BlockIdentifier + blockIdentifier: BlockIdentifier = 'pending' ): Promise { const block_id = new Block(blockIdentifier).identifier; return this.fetchEndpoint('starknet_getClassAt', { From 8dbd3c183413f298307f2b22941c6981191a62b2 Mon Sep 17 00:00:00 2001 From: Dhruv Kelawala Date: Wed, 9 Nov 2022 16:20:17 +0000 Subject: [PATCH 18/21] fix: wait for declare and deploy, use random salt --- __tests__/udc.test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/__tests__/udc.test.ts b/__tests__/udc.test.ts index 487d28e4c..2436b46c3 100644 --- a/__tests__/udc.test.ts +++ b/__tests__/udc.test.ts @@ -1,4 +1,5 @@ import { encodeShortString } from '../src/utils/shortString'; +import { randomAddress } from '../src/utils/stark'; import { IS_DEVNET, compiledErc20, getTestAccount, getTestProvider } from './fixtures'; describe('Declare and UDC Deploy Flow', () => { @@ -12,11 +13,15 @@ describe('Declare and UDC Deploy Flow', () => { contract: compiledErc20, }); + await provider.waitForTransaction(declareTx.transaction_hash); + expect(declareTx).toHaveProperty('class_hash'); expect(declareTx.class_hash).toEqual(erc20ClassHash); }); test('UDC Deploy', async () => { + const salt = randomAddress(); // use random salt + const deployment = await account.deploy({ classHash: erc20ClassHash, constructorCalldata: [ @@ -24,11 +29,13 @@ describe('Declare and UDC Deploy Flow', () => { encodeShortString('ERC20'), account.address, ], - salt: '123', + salt, unique: true, // Using true here so as not to clash with normal erc20 deploy in account and provider test isDevnet: IS_DEVNET, }); + await provider.waitForTransaction(deployment.transaction_hash); + expect(deployment).toHaveProperty('transaction_hash'); }); }); From f21e91c03d145ef24ec3076f9670e1af9db109b5 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 10 Nov 2022 11:26:51 +0100 Subject: [PATCH 19/21] test: rpc test for testnet 2 --- __tests__/rpcProvider.test.ts | 7 ++++--- src/constants.ts | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/__tests__/rpcProvider.test.ts b/__tests__/rpcProvider.test.ts index d027aa0df..d893bfc5c 100644 --- a/__tests__/rpcProvider.test.ts +++ b/__tests__/rpcProvider.test.ts @@ -1,4 +1,5 @@ import { Account, GetBlockResponse, RpcProvider, ec } from '../src'; +import { StarknetChainId } from '../src/constants'; import { compiledOpenZeppelinAccount, describeIfRpc, @@ -22,7 +23,7 @@ describeIfRpc('RPCProvider', () => { test('getChainId', async () => { const chainId = await rpcProvider.getChainId(); - expect(chainId).toBe('0x534e5f474f45524c49'); + expect(chainId).toBe(StarknetChainId.TESTNET2); }); test('getPendingTransactions', async () => { @@ -115,9 +116,9 @@ describeIfRpc('RPCProvider', () => { }); }); - test('getClass classHash 0x0733734fa0dab1158bccdfe0df7b0becf3827f908971fac8d39cc73d99ad8645', async () => { + test('getClass classHash 0x00808396477a4296946bf6574afb2e14723f8d9a37bba25a1e104315ca89b1f7', async () => { const contractClass = await rpcProvider.getClass( - '0x0733734fa0dab1158bccdfe0df7b0becf3827f908971fac8d39cc73d99ad8645' + '0x00808396477a4296946bf6574afb2e14723f8d9a37bba25a1e104315ca89b1f7' ); expect(contractClass).toHaveProperty('program'); expect(contractClass).toHaveProperty('entry_points_by_type'); diff --git a/src/constants.ts b/src/constants.ts index c0e0118c6..1cdb2728a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -11,6 +11,7 @@ export const MASK_251 = TWO.pow(toBN(251)); export enum StarknetChainId { MAINNET = '0x534e5f4d41494e', // encodeShortString('SN_MAIN'), TESTNET = '0x534e5f474f45524c49', // encodeShortString('SN_GOERLI'), + TESTNET2 = '0x534e5f474f45524c4932', } export enum TransactionHashPrefix { DECLARE = '0x6465636c617265', // encodeShortString('declare'), From a1dafad7056fb2e52849a8d5d533872254c62293 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 10 Nov 2022 15:30:05 +0100 Subject: [PATCH 20/21] fix: path rpc test to release --- src/provider/sequencer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/provider/sequencer.ts b/src/provider/sequencer.ts index c62933ad0..e8d4bccb6 100644 --- a/src/provider/sequencer.ts +++ b/src/provider/sequencer.ts @@ -78,7 +78,7 @@ export class SequencerProvider implements ProviderInterface { private responseParser = new SequencerAPIResponseParser(); - constructor(optionsOrProvider: SequencerProviderOptions = { network: 'goerli-alpha' }) { + constructor(optionsOrProvider: SequencerProviderOptions = { network: 'goerli-alpha-2' }) { if ('network' in optionsOrProvider) { this.baseUrl = SequencerProvider.getNetworkFromName(optionsOrProvider.network); this.chainId = SequencerProvider.getChainIdFromBaseUrl(this.baseUrl); From 73a2f3c0c86d1bef9386b29c35f9a684c642700b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 10 Nov 2022 15:18:28 +0000 Subject: [PATCH 21/21] chore(release): 4.10.0 [skip ci] # [4.10.0](https://github.com/0xs34n/starknet.js/compare/v4.9.0...v4.10.0) (2022-11-10) ### Bug Fixes * ci ([9b38cd8](https://github.com/0xs34n/starknet.js/commit/9b38cd8a2e23b71a1490c168ae83b64f479d3da9)) * deploy return type in interface ([6a663d4](https://github.com/0xs34n/starknet.js/commit/6a663d492751b0cd8493af6d4ee9a5cf5524ed19)) * path rpc test to release ([a1dafad](https://github.com/0xs34n/starknet.js/commit/a1dafad7056fb2e52849a8d5d533872254c62293)) * remove multiple RawArgs declaration ([b65dc65](https://github.com/0xs34n/starknet.js/commit/b65dc651bbd86708d4f88b7445813dab7dfea639)) * return type and rename calldata ([67fe081](https://github.com/0xs34n/starknet.js/commit/67fe081a24ca9eb64669ed9b0c2726898c68a34c)) * update readme ([7859cb1](https://github.com/0xs34n/starknet.js/commit/7859cb1d2b6e4e924f8bb21a1bbb9ada1a46a308)) * wait for declare and deploy, use random salt ([8dbd3c1](https://github.com/0xs34n/starknet.js/commit/8dbd3c183413f298307f2b22941c6981191a62b2)) ### Features * add multicall support ([4b99f4a](https://github.com/0xs34n/starknet.js/commit/4b99f4a7b09a03990e2ba9ea00de2d0206f93ce0)) * enable custom providers headers option ([f2e9b1a](https://github.com/0xs34n/starknet.js/commit/f2e9b1a439908179bad1f4bb0e0632180b7b658f)) * fix and add proper UDC tests ([d96cc53](https://github.com/0xs34n/starknet.js/commit/d96cc531786738de7d8ec285ccdaa39e76a94de3)) * provider docs update ([e5d0376](https://github.com/0xs34n/starknet.js/commit/e5d0376dd281b04c486c58786709c42ea1e3a5a7)) * testnet2 ([8a054d0](https://github.com/0xs34n/starknet.js/commit/8a054d0ceb312efc0b6d303cad73b9bb39ba4304)) * udc demo ([27b402b](https://github.com/0xs34n/starknet.js/commit/27b402b6eed4c2bec67bfbf7ee27c9636ca4ae2b)) * udc working example ([5c4452a](https://github.com/0xs34n/starknet.js/commit/5c4452aa2e6b50768438f1117794dce430984ff8)) --- CHANGELOG.md | 22 ++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 044da9872..289fae1f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +# [4.10.0](https://github.com/0xs34n/starknet.js/compare/v4.9.0...v4.10.0) (2022-11-10) + +### Bug Fixes + +- ci ([9b38cd8](https://github.com/0xs34n/starknet.js/commit/9b38cd8a2e23b71a1490c168ae83b64f479d3da9)) +- deploy return type in interface ([6a663d4](https://github.com/0xs34n/starknet.js/commit/6a663d492751b0cd8493af6d4ee9a5cf5524ed19)) +- path rpc test to release ([a1dafad](https://github.com/0xs34n/starknet.js/commit/a1dafad7056fb2e52849a8d5d533872254c62293)) +- remove multiple RawArgs declaration ([b65dc65](https://github.com/0xs34n/starknet.js/commit/b65dc651bbd86708d4f88b7445813dab7dfea639)) +- return type and rename calldata ([67fe081](https://github.com/0xs34n/starknet.js/commit/67fe081a24ca9eb64669ed9b0c2726898c68a34c)) +- update readme ([7859cb1](https://github.com/0xs34n/starknet.js/commit/7859cb1d2b6e4e924f8bb21a1bbb9ada1a46a308)) +- wait for declare and deploy, use random salt ([8dbd3c1](https://github.com/0xs34n/starknet.js/commit/8dbd3c183413f298307f2b22941c6981191a62b2)) + +### Features + +- add multicall support ([4b99f4a](https://github.com/0xs34n/starknet.js/commit/4b99f4a7b09a03990e2ba9ea00de2d0206f93ce0)) +- enable custom providers headers option ([f2e9b1a](https://github.com/0xs34n/starknet.js/commit/f2e9b1a439908179bad1f4bb0e0632180b7b658f)) +- fix and add proper UDC tests ([d96cc53](https://github.com/0xs34n/starknet.js/commit/d96cc531786738de7d8ec285ccdaa39e76a94de3)) +- provider docs update ([e5d0376](https://github.com/0xs34n/starknet.js/commit/e5d0376dd281b04c486c58786709c42ea1e3a5a7)) +- testnet2 ([8a054d0](https://github.com/0xs34n/starknet.js/commit/8a054d0ceb312efc0b6d303cad73b9bb39ba4304)) +- udc demo ([27b402b](https://github.com/0xs34n/starknet.js/commit/27b402b6eed4c2bec67bfbf7ee27c9636ca4ae2b)) +- udc working example ([5c4452a](https://github.com/0xs34n/starknet.js/commit/5c4452aa2e6b50768438f1117794dce430984ff8)) + # [4.9.0](https://github.com/0xs34n/starknet.js/compare/v4.8.0...v4.9.0) (2022-10-19) ### Bug Fixes diff --git a/package-lock.json b/package-lock.json index 936aca2db..7866a9926 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "starknet", - "version": "4.9.0", + "version": "4.10.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "starknet", - "version": "4.9.0", + "version": "4.10.0", "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.6.1", diff --git a/package.json b/package.json index 2686a412a..394326b71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "starknet", - "version": "4.9.0", + "version": "4.10.0", "description": "JavaScript library for StarkNet", "main": "dist/index.js", "types": "dist/index.d.ts",