@imtbl/sdk 0.3.0-alpha.2 → 0.3.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ import { Web3Provider, JsonRpcProvider } from '@ethersproject/providers';
11
11
  import { ethers, BigNumber as BigNumber$1, providers, constants, utils as utils$2, Contract as Contract$1, ContractFactory } from 'ethers';
12
12
  import { walletContracts } from '@0xsequence/abi';
13
13
  import { encodeSignature } from '@0xsequence/config';
14
+ import { EventEmitter } from 'events';
14
15
  import FormData$2 from 'form-data';
15
16
  import { Seaport as Seaport$1 } from '@opensea/seaport-js';
16
17
  import { parseUnits } from '@ethersproject/units';
@@ -5530,7 +5531,7 @@ class MultiRollupApiClients {
5530
5531
  }
5531
5532
 
5532
5533
  // eslint-disable-next-line @typescript-eslint/naming-convention
5533
- const defaultHeaders$1 = { 'x-sdk-version': 'ts-immutable-sdk-0.3.0-alpha.2' };
5534
+ const defaultHeaders$1 = { 'x-sdk-version': 'ts-immutable-sdk-0.3.0-alpha.3' };
5534
5535
  const createConfig = ({ basePath, headers, }) => {
5535
5536
  if (!basePath.trim()) {
5536
5537
  throw Error('basePath can not be empty');
@@ -5590,7 +5591,7 @@ class APIError extends Error {
5590
5591
 
5591
5592
  /* eslint-disable implicit-arrow-linebreak */
5592
5593
  const defaultHeaders = {
5593
- sdkVersion: 'ts-immutable-sdk-multi-rollup-api-client-0.3.0-alpha.2',
5594
+ sdkVersion: 'ts-immutable-sdk-multi-rollup-api-client-0.3.0-alpha.3',
5594
5595
  };
5595
5596
  /**
5596
5597
  * createAPIConfiguration to create a custom Configuration
@@ -5856,7 +5857,7 @@ const createImmutableXConfiguration = ({ basePath, chainID, coreContractAddress,
5856
5857
  chainID,
5857
5858
  coreContractAddress,
5858
5859
  registrationContractAddress,
5859
- sdkVersion: 'ts-immutable-sdk-0.3.0-alpha.2',
5860
+ sdkVersion: 'ts-immutable-sdk-0.3.0-alpha.3',
5860
5861
  });
5861
5862
  /**
5862
5863
  * Sets `sdkVersion` at the time of build
@@ -11295,7 +11296,7 @@ function digestOfTransactionsAndNonce(nonce, normalisedTransactions) {
11295
11296
  return ethers.utils.keccak256(packMetaTransactionsNonceData);
11296
11297
  }
11297
11298
  const getNonce = async (jsonRpcProvider, smartContractWalletAddress) => {
11298
- const code = await jsonRpcProvider.send('eth_getCode', [smartContractWalletAddress]);
11299
+ const code = await jsonRpcProvider.send('eth_getCode', [smartContractWalletAddress, 'latest']);
11299
11300
  if (code && code !== '0x') {
11300
11301
  const contract = new ethers.Contract(smartContractWalletAddress, walletContracts.mainModule.abi, jsonRpcProvider);
11301
11302
  return contract.nonce();
@@ -11346,7 +11347,21 @@ var RelayerTransactionStatus;
11346
11347
  RelayerTransactionStatus["REVERTED"] = "REVERTED";
11347
11348
  RelayerTransactionStatus["FAILED"] = "FAILED";
11348
11349
  })(RelayerTransactionStatus || (RelayerTransactionStatus = {}));
11350
+ var ProviderEventNames;
11351
+ (function (ProviderEventNames) {
11352
+ ProviderEventNames["ACCOUNTS_CHANGED"] = "accountsChanged";
11353
+ })(ProviderEventNames || (ProviderEventNames = {}));
11349
11354
 
11355
+ /**
11356
+ * ProviderErrors should take priority over RpcErrorCodes
11357
+ */
11358
+ var ProviderErrorCode;
11359
+ (function (ProviderErrorCode) {
11360
+ ProviderErrorCode[ProviderErrorCode["USER_REJECTED_REQUEST"] = 4001] = "USER_REJECTED_REQUEST";
11361
+ ProviderErrorCode[ProviderErrorCode["UNAUTHORIZED"] = 4100] = "UNAUTHORIZED";
11362
+ ProviderErrorCode[ProviderErrorCode["UNSUPPORTED_METHOD"] = 4200] = "UNSUPPORTED_METHOD";
11363
+ ProviderErrorCode[ProviderErrorCode["DISCONNECTED"] = 4900] = "DISCONNECTED";
11364
+ })(ProviderErrorCode || (ProviderErrorCode = {}));
11350
11365
  var RpcErrorCode;
11351
11366
  (function (RpcErrorCode) {
11352
11367
  RpcErrorCode[RpcErrorCode["RPC_SERVER_ERROR"] = -32000] = "RPC_SERVER_ERROR";
@@ -11354,7 +11369,6 @@ var RpcErrorCode;
11354
11369
  RpcErrorCode[RpcErrorCode["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
11355
11370
  RpcErrorCode[RpcErrorCode["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
11356
11371
  RpcErrorCode[RpcErrorCode["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
11357
- RpcErrorCode[RpcErrorCode["UNAUTHORIZED"] = -32604] = "UNAUTHORIZED";
11358
11372
  RpcErrorCode[RpcErrorCode["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
11359
11373
  })(RpcErrorCode || (RpcErrorCode = {}));
11360
11374
  class JsonRpcError extends Error {
@@ -11369,7 +11383,7 @@ class JsonRpcError extends Error {
11369
11383
 
11370
11384
  const MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES = 30;
11371
11385
  const TRANSACTION_HASH_RETRIEVAL_WAIT = 1000;
11372
- const ethSendTransaction = async ({ params, magicProvider, jsonRpcProvider, relayerClient, config, user, }) => {
11386
+ const sendTransaction = async ({ params, magicProvider, jsonRpcProvider, relayerClient, config, user, }) => {
11373
11387
  const transactionRequest = params[0];
11374
11388
  if (!transactionRequest.to) {
11375
11389
  throw new JsonRpcError(RpcErrorCode.INVALID_PARAMS, 'eth_sendTransaction requires a "to" field');
@@ -11434,6 +11448,19 @@ const ethSendTransaction = async ({ params, magicProvider, jsonRpcProvider, rela
11434
11448
  return relayerTransaction.hash;
11435
11449
  };
11436
11450
 
11451
+ class TypedEventEmitter {
11452
+ emitter = new EventEmitter();
11453
+ emit(eventName, ...eventArg) {
11454
+ this.emitter.emit(eventName, ...eventArg);
11455
+ }
11456
+ on(eventName, handler) {
11457
+ this.emitter.on(eventName, handler);
11458
+ }
11459
+ removeListener(eventName, handler) {
11460
+ this.emitter.removeListener(eventName, handler);
11461
+ }
11462
+ }
11463
+
11437
11464
  class RelayerClient {
11438
11465
  config;
11439
11466
  constructor({ config }) {
@@ -11493,7 +11520,7 @@ class RelayerClient {
11493
11520
  }
11494
11521
 
11495
11522
  const MESSAGE_TO_SIGN = 'Only sign this message from Immutable Passport';
11496
- async function createCounterfactualAddress({ authManager, magicProvider, multiRollupApiClients, accessToken, }) {
11523
+ async function registerZkEvmUser({ authManager, magicProvider, multiRollupApiClients, accessToken, }) {
11497
11524
  const web3Provider = new Web3Provider(magicProvider);
11498
11525
  const ethSigner = web3Provider.getSigner();
11499
11526
  const ethereumAddress = await ethSigner.getAddress();
@@ -11517,7 +11544,7 @@ async function createCounterfactualAddress({ authManager, magicProvider, multiRo
11517
11544
  return user;
11518
11545
  }
11519
11546
 
11520
- const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollupApiClients, }) => {
11547
+ const loginZkEvmUser = async ({ authManager, config, magicAdapter, multiRollupApiClients, }) => {
11521
11548
  const user = await authManager.getUser() || await authManager.login();
11522
11549
  if (!user.idToken) {
11523
11550
  throw new Error('User is missing idToken');
@@ -11525,7 +11552,7 @@ const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollu
11525
11552
  const magicProvider = await magicAdapter.login(user.idToken, config.network);
11526
11553
  if (!user.zkEvm) {
11527
11554
  // Generate counterfactual address and retrieve updated Auth0 user
11528
- const userZkevm = await createCounterfactualAddress({
11555
+ const userZkevm = await registerZkEvmUser({
11529
11556
  authManager,
11530
11557
  magicProvider,
11531
11558
  multiRollupApiClients,
@@ -11542,7 +11569,7 @@ const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollu
11542
11569
  };
11543
11570
  };
11544
11571
 
11545
- class ZkEvmProvider {
11572
+ class ZkEvmProvider extends TypedEventEmitter {
11546
11573
  authManager;
11547
11574
  config;
11548
11575
  confirmationScreen;
@@ -11553,6 +11580,7 @@ class ZkEvmProvider {
11553
11580
  magicProvider; // Used for signing
11554
11581
  user;
11555
11582
  constructor({ authManager, magicAdapter, config, confirmationScreen, multiRollupApiClients, }) {
11583
+ super();
11556
11584
  this.authManager = authManager;
11557
11585
  this.magicAdapter = magicAdapter;
11558
11586
  this.config = config;
@@ -11565,25 +11593,12 @@ class ZkEvmProvider {
11565
11593
  return this.magicProvider !== undefined && this.user !== undefined;
11566
11594
  }
11567
11595
  async performRequest(request) {
11568
- const authWrapper = (fn) => {
11569
- if (!this.isLoggedIn()) {
11570
- throw new JsonRpcError(RpcErrorCode.UNAUTHORIZED, 'Unauthorised - call eth_requestAccounts first');
11571
- }
11572
- return fn({
11573
- params: request.params || [],
11574
- magicProvider: this.magicProvider,
11575
- jsonRpcProvider: this.jsonRpcProvider,
11576
- config: this.config,
11577
- relayerClient: this.relayerClient,
11578
- user: this.user,
11579
- });
11580
- };
11581
11596
  switch (request.method) {
11582
11597
  case 'eth_requestAccounts': {
11583
11598
  if (this.isLoggedIn()) {
11584
11599
  return [this.user.zkEvm.ethAddress];
11585
11600
  }
11586
- const { magicProvider, user } = await registerZkEvmUser({
11601
+ const { magicProvider, user } = await loginZkEvmUser({
11587
11602
  authManager: this.authManager,
11588
11603
  config: this.config,
11589
11604
  magicAdapter: this.magicAdapter,
@@ -11591,10 +11606,21 @@ class ZkEvmProvider {
11591
11606
  });
11592
11607
  this.user = user;
11593
11608
  this.magicProvider = magicProvider;
11609
+ this.emit(ProviderEventNames.ACCOUNTS_CHANGED, [this.user.zkEvm.ethAddress]);
11594
11610
  return [this.user.zkEvm.ethAddress];
11595
11611
  }
11596
11612
  case 'eth_sendTransaction': {
11597
- return authWrapper(ethSendTransaction);
11613
+ if (!this.isLoggedIn()) {
11614
+ throw new JsonRpcError(ProviderErrorCode.UNAUTHORIZED, 'Unauthorised - call eth_requestAccounts first');
11615
+ }
11616
+ return sendTransaction({
11617
+ params: request.params || [],
11618
+ magicProvider: this.magicProvider,
11619
+ jsonRpcProvider: this.jsonRpcProvider,
11620
+ config: this.config,
11621
+ relayerClient: this.relayerClient,
11622
+ user: this.user,
11623
+ });
11598
11624
  }
11599
11625
  case 'eth_accounts': {
11600
11626
  return this.isLoggedIn() ? [this.user.zkEvm.ethAddress] : [];
@@ -11615,7 +11641,7 @@ class ZkEvmProvider {
11615
11641
  return this.jsonRpcProvider.send(request.method, request.params || []);
11616
11642
  }
11617
11643
  default: {
11618
- throw new JsonRpcError(RpcErrorCode.METHOD_NOT_FOUND, 'Method not supported');
11644
+ throw new JsonRpcError(ProviderErrorCode.UNSUPPORTED_METHOD, 'Method not supported');
11619
11645
  }
11620
11646
  }
11621
11647
  }
@@ -27317,16 +27343,28 @@ const SUPPORTED_CHAIN_IDS_FOR_ENVIRONMENT = {
27317
27343
  [Environment$1.PRODUCTION]: SUPPORTED_PRODUCTION_CHAINS,
27318
27344
  };
27319
27345
  function validateOverrides(overrides) {
27320
- Object.entries(overrides).forEach(([key, value]) => {
27321
- if (!value) {
27346
+ const keysToCheck = ['rpcURL', 'exchangeContracts', 'commonRoutingTokens', 'nativeToken'];
27347
+ for (const key of keysToCheck) {
27348
+ if (!overrides[key]) {
27322
27349
  throw new InvalidConfigurationError(`Missing override: ${key}`);
27323
27350
  }
27324
- });
27351
+ }
27325
27352
  Object.entries(overrides.exchangeContracts).forEach(([key, contract]) => {
27326
27353
  if (!isValidNonZeroAddress(contract)) {
27327
27354
  throw new InvalidConfigurationError(`Invalid exchange contract address for ${key}`);
27328
27355
  }
27329
27356
  });
27357
+ if (!overrides.secondaryFees) {
27358
+ return;
27359
+ }
27360
+ for (const secondaryFee of overrides.secondaryFees) {
27361
+ if (!isValidNonZeroAddress(secondaryFee.feeRecipient)) {
27362
+ throw new InvalidConfigurationError(`Invalid secondary fee recipient address: ${secondaryFee.feeRecipient}`);
27363
+ }
27364
+ if (secondaryFee.feeBasisPoints < 0 || secondaryFee.feeBasisPoints > 10000) {
27365
+ throw new InvalidConfigurationError(`Invalid secondary fee percentage: ${secondaryFee.feeBasisPoints}`);
27366
+ }
27367
+ }
27330
27368
  }
27331
27369
  /**
27332
27370
  * {@link ExchangeConfiguration} is used to configure the {@link Exchange} class.
@@ -27336,6 +27374,7 @@ function validateOverrides(overrides) {
27336
27374
  class ExchangeConfiguration {
27337
27375
  baseConfig;
27338
27376
  chain;
27377
+ secondaryFees;
27339
27378
  constructor({ chainId, baseConfig, overrides }) {
27340
27379
  this.baseConfig = baseConfig;
27341
27380
  if (overrides) {
@@ -27347,8 +27386,10 @@ class ExchangeConfiguration {
27347
27386
  commonRoutingTokens: overrides.commonRoutingTokens,
27348
27387
  nativeToken: overrides.nativeToken,
27349
27388
  };
27389
+ this.secondaryFees = overrides.secondaryFees ? overrides.secondaryFees : [];
27350
27390
  return;
27351
27391
  }
27392
+ this.secondaryFees = [];
27352
27393
  const chain = SUPPORTED_CHAIN_IDS_FOR_ENVIRONMENT[baseConfig.environment][chainId];
27353
27394
  if (!chain) {
27354
27395
  throw new ChainNotSupportedError(chainId, baseConfig.environment);
@@ -27362,11 +27403,13 @@ class Exchange {
27362
27403
  router;
27363
27404
  chainId;
27364
27405
  nativeToken;
27406
+ secondaryFees;
27365
27407
  constructor(configuration) {
27366
27408
  const config = new ExchangeConfiguration(configuration);
27367
27409
  this.chainId = config.chain.chainId;
27368
27410
  this.nativeToken = config.chain.nativeToken;
27369
27411
  this.provider = new ethers.providers.JsonRpcProvider(config.chain.rpcUrl);
27412
+ this.secondaryFees = config.secondaryFees;
27370
27413
  this.router = new Router(this.provider, config.chain.commonRoutingTokens, {
27371
27414
  multicallAddress: config.chain.contracts.multicall,
27372
27415
  factoryAddress: config.chain.contracts.coreFactory,
@@ -27449,6 +27492,9 @@ class Exchange {
27449
27492
  async getUnsignedSwapTxFromAmountOut(fromAddress, tokenInAddress, tokenOutAddress, amountOut, slippagePercent = DEFAULT_SLIPPAGE, maxHops = DEFAULT_MAX_HOPS, deadline = DEFAULT_DEADLINE) {
27450
27493
  return await this.getUnsignedSwapTx(fromAddress, tokenInAddress, tokenOutAddress, amountOut, slippagePercent, maxHops, deadline, TradeType.EXACT_OUTPUT);
27451
27494
  }
27495
+ thereAreSecondaryFees() {
27496
+ return this.secondaryFees.length > 0;
27497
+ }
27452
27498
  }
27453
27499
 
27454
27500
  /* eslint-disable class-methods-use-this */
@@ -28572,7 +28618,7 @@ class $a8cb37a3fc8eb863$export$1f60ba4ec72508a0 {
28572
28618
  function $parcel$export(e, n, v, s) {
28573
28619
  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
28574
28620
  }
28575
- const $d663162fd5a0853f$export$38a083d9fb5551ca = "0.3.0-alpha.2";
28621
+ const $d663162fd5a0853f$export$38a083d9fb5551ca = "0.3.0-alpha.3";
28576
28622
  const $d663162fd5a0853f$export$83bf90b30cdfd29f = ()=>false;
28577
28623
  const $d663162fd5a0853f$export$1169f5475725171b = ()=>$d663162fd5a0853f$export$38a083d9fb5551ca;
28578
28624
 
@@ -30371,4 +30417,4 @@ class ERC721PermissionedMintable {
30371
30417
  }
30372
30418
  }
30373
30419
 
30374
- export { APIError, BlockchainData, $15cc9e120aa6f3bf$export$d1bfa21f7c76447a as BridgeEventType, $1f969328e5988c99$export$30f61ebf204c69f6 as BridgeReact, $d85ad1457a3f1a83$export$161d4a74df65fc08 as CHECKOUT_API_BASE_URL, $0472f23319457bfb$export$c06e1e7429de6283 as ChainId, $0472f23319457bfb$export$b874c6b1dfe85e02 as ChainName, $a8cb37a3fc8eb863$export$1f60ba4ec72508a0 as Checkout, $a8bc256d81a5e2c1$export$e3dc0620abde7f5a as CheckoutErrorType, $045213b18e9f1f94$export$75be0f6af9650f2c as CheckoutWidgetTagNames, $430e3eda76fa4d5f$export$af210a0808087845 as CheckoutWidgets, $a85ecdbd885c58ad$export$e72e7f9969a47dd3 as ConnectEventType, $f2083cd30e2f5c56$export$49d62957f420a1e2 as ConnectReact, ERC20, ERC721PermissionedMintable, Environment$1 as Environment, $de275b98d2b651c3$export$788b1fd17f3dad84 as GasEstimateType, GenericIMXProvider, $207ed853f11d19d5$export$5a0ace85cae72d45 as IMTBLWidgetEvents, ImmutableConfiguration, ImmutableXClient, MetaMaskIMXProvider, $a47e48dd2c04791b$export$1f05a55fe0680cc7 as NetworkFilterTypes, Networks, $ad06b030b1a3ba34$export$b80d2daf830437b9 as OrchestrationEventType, Orderbook, Passport, PassportError, ProviderConfiguration, $53d219e7f6bf0cd6$export$140a49745ab55563 as SwapEventType, $a4fbb8e3a6aeff58$export$971e031379577f4 as SwapReact, $08d5ddc39acd6833$export$fd9b17d87f4121d2 as TokenFilterTypes, $430e3eda76fa4d5f$export$bf1548ba7e61c17f as UpdateConfig, $77b6aac5c353d4a9$export$d9be06b70b28c742 as WalletEventType, $4f91c5f280efe242$export$a75605c67ea83a5a as WalletFilterTypes, $e768639828688ca3$export$2d7a51a18d87e21d as WalletProviderName, $89d55ace0f8f1c07$export$ceaac94f34dba154 as WalletReact, $045213b18e9f1f94$export$c88931fdc51854eb as WidgetTheme, module };
30420
+ export { APIError, BlockchainData, $15cc9e120aa6f3bf$export$d1bfa21f7c76447a as BridgeEventType, $1f969328e5988c99$export$30f61ebf204c69f6 as BridgeReact, $d85ad1457a3f1a83$export$161d4a74df65fc08 as CHECKOUT_API_BASE_URL, $0472f23319457bfb$export$c06e1e7429de6283 as ChainId, $0472f23319457bfb$export$b874c6b1dfe85e02 as ChainName, $a8cb37a3fc8eb863$export$1f60ba4ec72508a0 as Checkout, $a8bc256d81a5e2c1$export$e3dc0620abde7f5a as CheckoutErrorType, $045213b18e9f1f94$export$75be0f6af9650f2c as CheckoutWidgetTagNames, $430e3eda76fa4d5f$export$af210a0808087845 as CheckoutWidgets, $a85ecdbd885c58ad$export$e72e7f9969a47dd3 as ConnectEventType, $f2083cd30e2f5c56$export$49d62957f420a1e2 as ConnectReact, ERC20, ERC721PermissionedMintable, Environment$1 as Environment, $de275b98d2b651c3$export$788b1fd17f3dad84 as GasEstimateType, GenericIMXProvider, $207ed853f11d19d5$export$5a0ace85cae72d45 as IMTBLWidgetEvents, ImmutableConfiguration, ImmutableXClient, JsonRpcError, MetaMaskIMXProvider, $a47e48dd2c04791b$export$1f05a55fe0680cc7 as NetworkFilterTypes, Networks, $ad06b030b1a3ba34$export$b80d2daf830437b9 as OrchestrationEventType, Orderbook, Passport, PassportError, ProviderConfiguration, ProviderErrorCode, ProviderEventNames, RpcErrorCode, $53d219e7f6bf0cd6$export$140a49745ab55563 as SwapEventType, $a4fbb8e3a6aeff58$export$971e031379577f4 as SwapReact, $08d5ddc39acd6833$export$fd9b17d87f4121d2 as TokenFilterTypes, $430e3eda76fa4d5f$export$bf1548ba7e61c17f as UpdateConfig, $77b6aac5c353d4a9$export$d9be06b70b28c742 as WalletEventType, $4f91c5f280efe242$export$a75605c67ea83a5a as WalletFilterTypes, $e768639828688ca3$export$2d7a51a18d87e21d as WalletProviderName, $89d55ace0f8f1c07$export$ceaac94f34dba154 as WalletReact, $045213b18e9f1f94$export$c88931fdc51854eb as WidgetTheme, module };
@@ -10509,19 +10509,27 @@ type DeviceTokenResponse = {
10509
10509
  expires_in: number;
10510
10510
  };
10511
10511
 
10512
+ /**
10513
+ * ProviderErrors should take priority over RpcErrorCodes
10514
+ */
10515
+ declare enum ProviderErrorCode {
10516
+ USER_REJECTED_REQUEST = 4001,
10517
+ UNAUTHORIZED = 4100,
10518
+ UNSUPPORTED_METHOD = 4200,
10519
+ DISCONNECTED = 4900
10520
+ }
10512
10521
  declare enum RpcErrorCode {
10513
10522
  RPC_SERVER_ERROR = -32000,
10514
10523
  INVALID_REQUEST = -32600,
10515
10524
  METHOD_NOT_FOUND = -32601,
10516
10525
  INVALID_PARAMS = -32602,
10517
10526
  INTERNAL_ERROR = -32603,
10518
- UNAUTHORIZED = -32604,
10519
10527
  PARSE_ERROR = -32700
10520
10528
  }
10521
10529
  declare class JsonRpcError extends Error {
10522
10530
  readonly message: string;
10523
- readonly code: RpcErrorCode;
10524
- constructor(code: RpcErrorCode, message: string);
10531
+ readonly code: ProviderErrorCode | RpcErrorCode;
10532
+ constructor(code: ProviderErrorCode | RpcErrorCode, message: string);
10525
10533
  }
10526
10534
 
10527
10535
  interface RequestArguments {
@@ -10545,7 +10553,13 @@ type Provider = {
10545
10553
  request: (request: RequestArguments) => Promise<any>;
10546
10554
  sendAsync: (request: JsonRpcRequestPayload | JsonRpcRequestPayload[], callback: JsonRpcRequestCallback) => void;
10547
10555
  send: (request: string | JsonRpcRequestPayload | JsonRpcRequestPayload[], callbackOrParams?: JsonRpcRequestCallback | Array<any>, callback?: JsonRpcRequestCallback) => void;
10556
+ on: (event: string, listener: (...args: any[]) => void) => void;
10557
+ removeListener: (event: string, listener: (...args: any[]) => void) => void;
10548
10558
  };
10559
+ declare enum ProviderEventNames {
10560
+ ACCOUNTS_CHANGED = "accountsChanged"
10561
+ }
10562
+ type AccountsChangedEvent = Array<string>;
10549
10563
 
10550
10564
  declare class Passport {
10551
10565
  private readonly authManager;
@@ -10580,4 +10594,4 @@ declare class Passport {
10580
10594
  getAccessToken(): Promise<string | undefined>;
10581
10595
  }
10582
10596
 
10583
- export { DeviceConnectResponse, DeviceTokenResponse, JsonRpcRequestCallback, JsonRpcRequestPayload, JsonRpcResponsePayload, Networks, Passport, PassportError, PassportModuleConfiguration, PassportOverrides, Provider, RequestArguments, UserProfile };
10597
+ export { AccountsChangedEvent, DeviceConnectResponse, DeviceTokenResponse, JsonRpcError, JsonRpcRequestCallback, JsonRpcRequestPayload, JsonRpcResponsePayload, Networks, Passport, PassportError, PassportModuleConfiguration, PassportOverrides, Provider, ProviderErrorCode, ProviderEventNames, RequestArguments, RpcErrorCode, UserProfile };
package/dist/passport.js CHANGED
@@ -10,6 +10,7 @@ import { Web3Provider, JsonRpcProvider } from '@ethersproject/providers';
10
10
  import { ethers, BigNumber } from 'ethers';
11
11
  import { walletContracts } from '@0xsequence/abi';
12
12
  import { encodeSignature } from '@0xsequence/config';
13
+ import { EventEmitter } from 'events';
13
14
 
14
15
  function bind$1(fn, thisArg) {
15
16
  return function wrap() {
@@ -4606,7 +4607,7 @@ class MultiRollupApiClients {
4606
4607
  }
4607
4608
 
4608
4609
  // eslint-disable-next-line @typescript-eslint/naming-convention
4609
- const defaultHeaders = { 'x-sdk-version': 'ts-immutable-sdk-0.3.0-alpha.2' };
4610
+ const defaultHeaders = { 'x-sdk-version': 'ts-immutable-sdk-0.3.0-alpha.3' };
4610
4611
  const createConfig = ({ basePath, headers, }) => {
4611
4612
  if (!basePath.trim()) {
4612
4613
  throw Error('basePath can not be empty');
@@ -4662,7 +4663,7 @@ const createImmutableXConfiguration = ({ basePath, chainID, coreContractAddress,
4662
4663
  chainID,
4663
4664
  coreContractAddress,
4664
4665
  registrationContractAddress,
4665
- sdkVersion: 'ts-immutable-sdk-0.3.0-alpha.2',
4666
+ sdkVersion: 'ts-immutable-sdk-0.3.0-alpha.3',
4666
4667
  });
4667
4668
  /**
4668
4669
  * Sets `sdkVersion` at the time of build
@@ -10092,7 +10093,7 @@ function digestOfTransactionsAndNonce(nonce, normalisedTransactions) {
10092
10093
  return ethers.utils.keccak256(packMetaTransactionsNonceData);
10093
10094
  }
10094
10095
  const getNonce = async (jsonRpcProvider, smartContractWalletAddress) => {
10095
- const code = await jsonRpcProvider.send('eth_getCode', [smartContractWalletAddress]);
10096
+ const code = await jsonRpcProvider.send('eth_getCode', [smartContractWalletAddress, 'latest']);
10096
10097
  if (code && code !== '0x') {
10097
10098
  const contract = new ethers.Contract(smartContractWalletAddress, walletContracts.mainModule.abi, jsonRpcProvider);
10098
10099
  return contract.nonce();
@@ -10143,7 +10144,21 @@ var RelayerTransactionStatus;
10143
10144
  RelayerTransactionStatus["REVERTED"] = "REVERTED";
10144
10145
  RelayerTransactionStatus["FAILED"] = "FAILED";
10145
10146
  })(RelayerTransactionStatus || (RelayerTransactionStatus = {}));
10147
+ var ProviderEventNames;
10148
+ (function (ProviderEventNames) {
10149
+ ProviderEventNames["ACCOUNTS_CHANGED"] = "accountsChanged";
10150
+ })(ProviderEventNames || (ProviderEventNames = {}));
10146
10151
 
10152
+ /**
10153
+ * ProviderErrors should take priority over RpcErrorCodes
10154
+ */
10155
+ var ProviderErrorCode;
10156
+ (function (ProviderErrorCode) {
10157
+ ProviderErrorCode[ProviderErrorCode["USER_REJECTED_REQUEST"] = 4001] = "USER_REJECTED_REQUEST";
10158
+ ProviderErrorCode[ProviderErrorCode["UNAUTHORIZED"] = 4100] = "UNAUTHORIZED";
10159
+ ProviderErrorCode[ProviderErrorCode["UNSUPPORTED_METHOD"] = 4200] = "UNSUPPORTED_METHOD";
10160
+ ProviderErrorCode[ProviderErrorCode["DISCONNECTED"] = 4900] = "DISCONNECTED";
10161
+ })(ProviderErrorCode || (ProviderErrorCode = {}));
10147
10162
  var RpcErrorCode;
10148
10163
  (function (RpcErrorCode) {
10149
10164
  RpcErrorCode[RpcErrorCode["RPC_SERVER_ERROR"] = -32000] = "RPC_SERVER_ERROR";
@@ -10151,7 +10166,6 @@ var RpcErrorCode;
10151
10166
  RpcErrorCode[RpcErrorCode["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
10152
10167
  RpcErrorCode[RpcErrorCode["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
10153
10168
  RpcErrorCode[RpcErrorCode["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
10154
- RpcErrorCode[RpcErrorCode["UNAUTHORIZED"] = -32604] = "UNAUTHORIZED";
10155
10169
  RpcErrorCode[RpcErrorCode["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
10156
10170
  })(RpcErrorCode || (RpcErrorCode = {}));
10157
10171
  class JsonRpcError extends Error {
@@ -10166,7 +10180,7 @@ class JsonRpcError extends Error {
10166
10180
 
10167
10181
  const MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES = 30;
10168
10182
  const TRANSACTION_HASH_RETRIEVAL_WAIT = 1000;
10169
- const ethSendTransaction = async ({ params, magicProvider, jsonRpcProvider, relayerClient, config, user, }) => {
10183
+ const sendTransaction = async ({ params, magicProvider, jsonRpcProvider, relayerClient, config, user, }) => {
10170
10184
  const transactionRequest = params[0];
10171
10185
  if (!transactionRequest.to) {
10172
10186
  throw new JsonRpcError(RpcErrorCode.INVALID_PARAMS, 'eth_sendTransaction requires a "to" field');
@@ -10231,6 +10245,19 @@ const ethSendTransaction = async ({ params, magicProvider, jsonRpcProvider, rela
10231
10245
  return relayerTransaction.hash;
10232
10246
  };
10233
10247
 
10248
+ class TypedEventEmitter {
10249
+ emitter = new EventEmitter();
10250
+ emit(eventName, ...eventArg) {
10251
+ this.emitter.emit(eventName, ...eventArg);
10252
+ }
10253
+ on(eventName, handler) {
10254
+ this.emitter.on(eventName, handler);
10255
+ }
10256
+ removeListener(eventName, handler) {
10257
+ this.emitter.removeListener(eventName, handler);
10258
+ }
10259
+ }
10260
+
10234
10261
  class RelayerClient {
10235
10262
  config;
10236
10263
  constructor({ config }) {
@@ -10290,7 +10317,7 @@ class RelayerClient {
10290
10317
  }
10291
10318
 
10292
10319
  const MESSAGE_TO_SIGN = 'Only sign this message from Immutable Passport';
10293
- async function createCounterfactualAddress({ authManager, magicProvider, multiRollupApiClients, accessToken, }) {
10320
+ async function registerZkEvmUser({ authManager, magicProvider, multiRollupApiClients, accessToken, }) {
10294
10321
  const web3Provider = new Web3Provider(magicProvider);
10295
10322
  const ethSigner = web3Provider.getSigner();
10296
10323
  const ethereumAddress = await ethSigner.getAddress();
@@ -10314,7 +10341,7 @@ async function createCounterfactualAddress({ authManager, magicProvider, multiRo
10314
10341
  return user;
10315
10342
  }
10316
10343
 
10317
- const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollupApiClients, }) => {
10344
+ const loginZkEvmUser = async ({ authManager, config, magicAdapter, multiRollupApiClients, }) => {
10318
10345
  const user = await authManager.getUser() || await authManager.login();
10319
10346
  if (!user.idToken) {
10320
10347
  throw new Error('User is missing idToken');
@@ -10322,7 +10349,7 @@ const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollu
10322
10349
  const magicProvider = await magicAdapter.login(user.idToken, config.network);
10323
10350
  if (!user.zkEvm) {
10324
10351
  // Generate counterfactual address and retrieve updated Auth0 user
10325
- const userZkevm = await createCounterfactualAddress({
10352
+ const userZkevm = await registerZkEvmUser({
10326
10353
  authManager,
10327
10354
  magicProvider,
10328
10355
  multiRollupApiClients,
@@ -10339,7 +10366,7 @@ const registerZkEvmUser = async ({ authManager, config, magicAdapter, multiRollu
10339
10366
  };
10340
10367
  };
10341
10368
 
10342
- class ZkEvmProvider {
10369
+ class ZkEvmProvider extends TypedEventEmitter {
10343
10370
  authManager;
10344
10371
  config;
10345
10372
  confirmationScreen;
@@ -10350,6 +10377,7 @@ class ZkEvmProvider {
10350
10377
  magicProvider; // Used for signing
10351
10378
  user;
10352
10379
  constructor({ authManager, magicAdapter, config, confirmationScreen, multiRollupApiClients, }) {
10380
+ super();
10353
10381
  this.authManager = authManager;
10354
10382
  this.magicAdapter = magicAdapter;
10355
10383
  this.config = config;
@@ -10362,25 +10390,12 @@ class ZkEvmProvider {
10362
10390
  return this.magicProvider !== undefined && this.user !== undefined;
10363
10391
  }
10364
10392
  async performRequest(request) {
10365
- const authWrapper = (fn) => {
10366
- if (!this.isLoggedIn()) {
10367
- throw new JsonRpcError(RpcErrorCode.UNAUTHORIZED, 'Unauthorised - call eth_requestAccounts first');
10368
- }
10369
- return fn({
10370
- params: request.params || [],
10371
- magicProvider: this.magicProvider,
10372
- jsonRpcProvider: this.jsonRpcProvider,
10373
- config: this.config,
10374
- relayerClient: this.relayerClient,
10375
- user: this.user,
10376
- });
10377
- };
10378
10393
  switch (request.method) {
10379
10394
  case 'eth_requestAccounts': {
10380
10395
  if (this.isLoggedIn()) {
10381
10396
  return [this.user.zkEvm.ethAddress];
10382
10397
  }
10383
- const { magicProvider, user } = await registerZkEvmUser({
10398
+ const { magicProvider, user } = await loginZkEvmUser({
10384
10399
  authManager: this.authManager,
10385
10400
  config: this.config,
10386
10401
  magicAdapter: this.magicAdapter,
@@ -10388,10 +10403,21 @@ class ZkEvmProvider {
10388
10403
  });
10389
10404
  this.user = user;
10390
10405
  this.magicProvider = magicProvider;
10406
+ this.emit(ProviderEventNames.ACCOUNTS_CHANGED, [this.user.zkEvm.ethAddress]);
10391
10407
  return [this.user.zkEvm.ethAddress];
10392
10408
  }
10393
10409
  case 'eth_sendTransaction': {
10394
- return authWrapper(ethSendTransaction);
10410
+ if (!this.isLoggedIn()) {
10411
+ throw new JsonRpcError(ProviderErrorCode.UNAUTHORIZED, 'Unauthorised - call eth_requestAccounts first');
10412
+ }
10413
+ return sendTransaction({
10414
+ params: request.params || [],
10415
+ magicProvider: this.magicProvider,
10416
+ jsonRpcProvider: this.jsonRpcProvider,
10417
+ config: this.config,
10418
+ relayerClient: this.relayerClient,
10419
+ user: this.user,
10420
+ });
10395
10421
  }
10396
10422
  case 'eth_accounts': {
10397
10423
  return this.isLoggedIn() ? [this.user.zkEvm.ethAddress] : [];
@@ -10412,7 +10438,7 @@ class ZkEvmProvider {
10412
10438
  return this.jsonRpcProvider.send(request.method, request.params || []);
10413
10439
  }
10414
10440
  default: {
10415
- throw new JsonRpcError(RpcErrorCode.METHOD_NOT_FOUND, 'Method not supported');
10441
+ throw new JsonRpcError(ProviderErrorCode.UNSUPPORTED_METHOD, 'Method not supported');
10416
10442
  }
10417
10443
  }
10418
10444
  }
@@ -10599,4 +10625,4 @@ class Passport {
10599
10625
  }
10600
10626
  }
10601
10627
 
10602
- export { Networks, Passport, PassportError };
10628
+ export { JsonRpcError, Networks, Passport, PassportError, ProviderErrorCode, ProviderEventNames, RpcErrorCode };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@imtbl/sdk",
3
3
  "description": "Immutable Unified SDK",
4
- "version": "0.3.0-alpha.2",
4
+ "version": "0.3.0-alpha.3",
5
5
  "author": "Immutable",
6
6
  "browser": "./dist/index.browser.js",
7
7
  "bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
@@ -15,7 +15,7 @@
15
15
  "@jest/globals": "^29.5.0",
16
16
  "@magic-ext/oidc": "^1.0.1",
17
17
  "@metamask/detect-provider": "^2.0.0",
18
- "@opensea/seaport-js": "^1.3.0",
18
+ "@opensea/seaport-js": "2.0.5",
19
19
  "@uniswap/router-sdk": "^1.4.0",
20
20
  "@uniswap/sdk-core": "^3.0.1",
21
21
  "@uniswap/v3-sdk": "^3.9.0",