Skip to content

Commit 078f41a

Browse files
authored
Fix signature issue in signAsync + send flow (#6177)
* feat: add extrinsicInfoMap to track signed transaction updates * fix: update extrinsicInfoMap to use 'this' instead of extrinsic * fix: remove extrinsic from extrinsicInfoMap after sending transaction
1 parent 2f912dc commit 078f41a

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

packages/api/src/submittable/createClass.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ function optionsOrNonce (partialOptions: Partial<SignerOptions> = {}): Partial<S
9393
export function createClass <ApiType extends ApiTypes> ({ api, apiType, blockHash, decorateMethod }: SubmittableOptions<ApiType>): CodecClass<SubmittableExtrinsic<ApiType>> {
9494
// an instance of the base extrinsic for us to extend
9595
const ExtrinsicBase = api.registry.createClass('Extrinsic');
96+
const extrinsicInfoMap = new WeakMap<SubmittableExtrinsic<ApiType>, UpdateInfo>();
9697

9798
class Submittable extends ExtrinsicBase implements SubmittableExtrinsic<ApiType> {
9899
readonly #ignoreStatusCb: boolean;
@@ -188,24 +189,39 @@ export function createClass <ApiType extends ApiTypes> ({ api, apiType, blockHas
188189
// send implementation for both immediate Hash and statusCb variants
189190
public send (statusCb?: Callback<ISubmittableResult>): SubmittableResultResult<ApiType> | SubmittableResultSubscription<ApiType> {
190191
const isSubscription = api.hasSubscriptions && (this.#ignoreStatusCb || !!statusCb);
192+
const updatedInfo = extrinsicInfoMap.get(this);
193+
194+
extrinsicInfoMap.delete(this);
191195

192196
// eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call
193197
return decorateMethod(
194198
isSubscription
195-
? this.#observeSubscribe
196-
: this.#observeSend
199+
? () => this.#observeSubscribe(updatedInfo)
200+
: () => this.#observeSend(updatedInfo)
197201
)(statusCb);
198202
}
199203

200204
/**
201205
* @description Signs a transaction, returning `this` to allow chaining. E.g.: `signAsync(...).send()`. Like `.signAndSend` this will retrieve the nonce and blockHash to send the tx with.
202-
*/
206+
*/
203207
public signAsync (account: AddressOrPair, partialOptions?: Partial<SignerOptions>): PromiseOrObs<ApiType, this> {
204208
// eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call
205209
return decorateMethod(
206210
(): Observable<this> =>
207211
this.#observeSign(account, partialOptions).pipe(
208-
map(() => this)
212+
map((info) => {
213+
// If we got a full signed transaction from the signer, attach it
214+
if (info.signedTransaction) {
215+
const extrinsic = new Submittable(api.registry, info.signedTransaction);
216+
217+
extrinsicInfoMap.set(this, info);
218+
219+
return extrinsic as this;
220+
}
221+
222+
// Fallback if signer didn’t return signedTransaction
223+
return this;
224+
})
209225
)
210226
)();
211227
}

0 commit comments

Comments
 (0)