diff --git a/.changeset/plenty-mirrors-lay.md b/.changeset/plenty-mirrors-lay.md new file mode 100644 index 000000000..607c33bdf --- /dev/null +++ b/.changeset/plenty-mirrors-lay.md @@ -0,0 +1,8 @@ +--- +"@swapkit/toolbox-substrate": patch +"@swapkit/wallet-polkadotjs": patch +"@swapkit/plugin-chainflip": patch +"@swapkit/wallet-talisman": patch +--- + +Fix substrate signAndBroadcast and getAddress diff --git a/packages/plugins/chainflip/src/broker.ts b/packages/plugins/chainflip/src/broker.ts index c25342065..db9b2a27e 100644 --- a/packages/plugins/chainflip/src/broker.ts +++ b/packages/plugins/chainflip/src/broker.ts @@ -48,7 +48,7 @@ const registerAsBroker = (toolbox: Awaited>) throw new SwapKitError("chainflip_broker_register"); } - return toolbox.signAndBroadcast(extrinsic); + return toolbox.signAndBroadcast({ tx: extrinsic, address: toolbox.getAddress() }); }; const withdrawFee = @@ -71,35 +71,38 @@ const withdrawFee = throw new SwapKitError("chainflip_broker_withdraw"); } - toolbox.signAndBroadcast(extrinsic, async (result) => { - if (!result.status?.isFinalized) { - return; - } + toolbox.signAndBroadcast({ + tx: extrinsic, + callback: async (result) => { + if (!result.status?.isFinalized) { + return; + } - const withdrawEvent = result.events.find( - (event) => event.event.method === "WithdrawalRequested", - ); - - if (!withdrawEvent) { - throw new SwapKitError( - "chainflip_channel_error", - "Could not find 'WithdrawalRequested' event", + const withdrawEvent = result.events.find( + (event) => event.event.method === "WithdrawalRequested", ); - } - - const { - event: { - data: { egressId, egressAsset, egressAmount, egressFee, destinationAddress }, - }, - } = withdrawEvent.toHuman() as any; - - resolve({ - egressId, - egressAsset, - egressAmount, - egressFee, - destinationAddress, - }); + + if (!withdrawEvent) { + throw new SwapKitError( + "chainflip_channel_error", + "Could not find 'WithdrawalRequested' event", + ); + } + + const { + event: { + data: { egressId, egressAsset, egressAmount, egressFee, destinationAddress }, + }, + } = withdrawEvent.toHuman() as any; + + resolve({ + egressId, + egressAsset, + egressAmount, + egressFee, + destinationAddress, + }); + }, }); }); }; diff --git a/packages/toolboxes/substrate/src/toolbox/baseSubstrateToolbox.ts b/packages/toolboxes/substrate/src/toolbox/baseSubstrateToolbox.ts index 03e680c30..4d2efbb93 100644 --- a/packages/toolboxes/substrate/src/toolbox/baseSubstrateToolbox.ts +++ b/packages/toolboxes/substrate/src/toolbox/baseSubstrateToolbox.ts @@ -143,6 +143,28 @@ const signAndBroadcast = ( return hash.toString(); }; +const signAndBroadcastSigner = async ({ + signer, + address, + tx, + callback, + api, +}: { + signer: Signer; + address: string; + tx: SubmittableExtrinsic<"promise">; + api: ApiPromise; + callback?: Callback; +}) => { + const nonce = await getNonce(api, address); + if (callback) { + tx.signAndSend(address, { nonce, signer }, callback); + } + const hash = tx.signAndSend(address, { nonce, signer }); + + return hash.toString(); +}; + function decodeAddress(address: string, networkPrefix?: number) { return isHex(address) ? hexToU8a(address) @@ -197,14 +219,23 @@ export const BaseSubstrateToolbox = ({ }, broadcast: (tx: SubmittableExtrinsic<"promise">, callback?: Callback) => broadcast(tx, callback), - signAndBroadcast: ( - tx: SubmittableExtrinsic<"promise">, - callback?: Callback, - ) => { + signAndBroadcast: ({ + tx, + callback, + address, + }: { + tx: SubmittableExtrinsic<"promise">; + callback?: Callback; + address?: string; + }) => { if (isKeyringPair(signer)) { return signAndBroadcast(signer, tx, callback); } + if (address) { + return signAndBroadcastSigner({ signer, address, tx, callback, api }); + } + throw new SwapKitError( "core_wallet_not_keypair_wallet", "Signer does not have keyring pair capabilities required for signing.", diff --git a/packages/wallets/polkadotjs/src/helpers.ts b/packages/wallets/polkadotjs/src/helpers.ts index 433c68cf0..ef578d37a 100644 --- a/packages/wallets/polkadotjs/src/helpers.ts +++ b/packages/wallets/polkadotjs/src/helpers.ts @@ -40,7 +40,10 @@ export const getWalletForChain = async ({ const subAddress: string = accounts[0].address; const newPrefix = 0; const address = convertAddress(subAddress, newPrefix); - return { walletMethods: toolbox, address }; + return { + walletMethods: { ...toolbox, getAddress: () => address }, + address, + }; } default: diff --git a/packages/wallets/talisman/src/helpers.ts b/packages/wallets/talisman/src/helpers.ts index 3e7b288c0..b2ff70dd9 100644 --- a/packages/wallets/talisman/src/helpers.ts +++ b/packages/wallets/talisman/src/helpers.ts @@ -143,9 +143,13 @@ export const getWalletForChain = async ({ info: { wallet: WalletOption.TALISMAN, accounts, address: accounts[0]?.address }, }); } - const [{ address }] = accounts; - return { walletMethods: toolbox, address: convertAddress(address, Network[chain].prefix) }; + const address = convertAddress(accounts[0].address, Network[chain].prefix); + + return { + walletMethods: { ...toolbox, getAddress: () => address }, + address, + }; } default: