Skip to content
This repository was archived by the owner on Sep 14, 2023. It is now read-only.

Commit 20f36c8

Browse files
authored
fix: add ChargeAssetTxPayment to pjs_sender (#1105)
1 parent 34002ce commit 20f36c8

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

patterns/compat/pjs_sender.ts

+32-18
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AddressPrefixChain, Chain, ChainRune, ExtrinsicSender } from "../../flu
44
import { SignerError } from "../../frame_metadata/mod.ts"
55
import { Rune, RunicArgs } from "../../rune/mod.ts"
66

7-
export type PjsSigner = { signPayload(payload: any): Promise<{ signature: string }> }
7+
export type PjsSigner = { signPayload?(payload: any): Promise<{ signature: string }> }
88

99
export function pjsSender<C extends AddressPrefixChain, CU>(
1010
chain: ChainRune<C, CU>,
@@ -43,7 +43,7 @@ export function pjsSender<C extends AddressPrefixChain, CU>(
4343
payload.address = address
4444
let sig
4545
try {
46-
sig = await pjsSigner.signPayload(payload)
46+
sig = await pjsSigner.signPayload!(payload)
4747
} catch (e) {
4848
throw new SignerError(e)
4949
}
@@ -55,14 +55,18 @@ export function pjsSender<C extends AddressPrefixChain, CU>(
5555
}
5656
}
5757

58-
const convertExtensionCodec = (keyMap: Record<string, string>) => {
58+
type KeyHandler = (codec: $.Codec<any>) => $.Codec<any>
59+
60+
const simpleKeyHandler = (pjsKey: string): KeyHandler => (value) => $.field(pjsKey, $pjs(value))
61+
62+
const convertExtensionCodec = (keyMap: Record<string, KeyHandler>) => {
5963
const visitor: $.CodecVisitor<$.Codec<any>> = new $.CodecVisitor<$.Codec<any>>()
6064
.add($.field, (_, key: string, value) => {
61-
const pjsKey = keyMap[key]
62-
if (pjsKey === undefined) {
65+
const handler = keyMap[key]
66+
if (handler === undefined) {
6367
throw new Error(`pjs signer: unknown extension ${key}`)
6468
}
65-
return $.field(pjsKey, $pjs(value))
69+
return handler(value)
6670
})
6771
.add($.object, (_, ...fields) => $.object(...fields.map((x) => visitor.visit(x))))
6872
return visitor
@@ -72,20 +76,30 @@ const keys: $.CodecVisitor<string[]> = new $.CodecVisitor<string[]>()
7276
.add($.field, (_, key: string, _v) => [key])
7377
.add($.object, (_, ...fields) => fields.flatMap((x) => keys.visit(x)))
7478

75-
const pjsExtraKeyMap: Record<string, string> = {
76-
CheckEra: "era",
77-
CheckMortality: "era",
78-
ChargeTransactionPayment: "tip",
79-
CheckNonce: "nonce",
79+
// https://github.com/polkadot-js/api/tree/8282159/packages/types/src/extrinsic/signedExtensions
80+
81+
const pjsExtraKeyMap: Record<string, KeyHandler> = {
82+
CheckEra: simpleKeyHandler("era"),
83+
CheckMortality: simpleKeyHandler("era"),
84+
ChargeTransactionPayment: simpleKeyHandler("tip"),
85+
CheckNonce: simpleKeyHandler("nonce"),
86+
ChargeAssetTxPayment: (value) => {
87+
// https://github.com/polkadot-js/api/blob/8282159/packages/types/src/extrinsic/signedExtensions/statemint.ts
88+
// pjs essentially spreads this into the extrinsic
89+
const visitor: $.CodecVisitor<$.Codec<any>> = new $.CodecVisitor<$.Codec<any>>()
90+
.add($.field, (_, key, value) => $.field(key, $pjs(value)))
91+
.add($.object, (_, ...fields) => $.object(...fields.map((x) => visitor.visit(x))))
92+
return visitor.visit(value)
93+
},
8094
}
8195

82-
const pjsAdditionalKeyMap: Record<string, string> = {
83-
CheckEra: "blockHash",
84-
CheckMortality: "blockHash",
85-
CheckSpecVersion: "specVersion",
86-
CheckTxVersion: "transactionVersion",
87-
CheckVersion: "specVersion",
88-
CheckGenesis: "genesisHash",
96+
const pjsAdditionalKeyMap: Record<string, KeyHandler> = {
97+
CheckEra: simpleKeyHandler("blockHash"),
98+
CheckMortality: simpleKeyHandler("blockHash"),
99+
CheckSpecVersion: simpleKeyHandler("specVersion"),
100+
CheckTxVersion: simpleKeyHandler("transactionVersion"),
101+
CheckVersion: simpleKeyHandler("specVersion"),
102+
CheckGenesis: simpleKeyHandler("genesisHash"),
89103
}
90104

91105
function $pjs<T>($inner: $.Codec<T>): $.Codec<(T & number) | string> {

0 commit comments

Comments
 (0)