Skip to content

Commit 41f2842

Browse files
authored
Merge pull request #421 from Concordium/fix-sc-params-bigint
Fix: Error when using bigint in smart contract parameters
2 parents 2117961 + 9e219d8 commit 41f2842

File tree

10 files changed

+34
-6
lines changed

10 files changed

+34
-6
lines changed

packages/browser-wallet-api-helpers/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
### Fixed
4+
5+
- Extend type `SmartContractParameters` with `bigint` allowing large numbers in smart contract parameters.
6+
37
## 3.0.0
48

59
### Breaking changes

packages/browser-wallet-api-helpers/src/wallet-api-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export type SmartContractParameters =
7070
| { [key: string]: SmartContractParameters }
7171
| SmartContractParameters[]
7272
| number
73+
| bigint
7374
| string
7475
| boolean;
7576

packages/browser-wallet-api/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
"@concordium/web-sdk": "^7.1.0",
1313
"@protobuf-ts/grpcweb-transport": "^2.8.2",
1414
"@protobuf-ts/runtime-rpc": "^2.8.2",
15-
"buffer": "^6.0.3"
15+
"buffer": "^6.0.3",
16+
"json-bigint": "^1.0.0"
1617
},
1718
"devDependencies": {
19+
"@types/json-bigint": "^1.0.2",
1820
"jest": "^29.7.0",
1921
"ts-jest": "^29.1.1"
2022
},

packages/browser-wallet-api/src/wallet-api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import EventEmitter from 'events';
3030
import { IdProofOutput, IdStatement } from '@concordium/web-sdk/id';
3131
import { ConcordiumGRPCClient } from '@concordium/web-sdk/grpc';
3232
import { RpcTransport } from '@protobuf-ts/runtime-rpc';
33+
import * as JSONBig from 'json-bigint';
3334
import { stringify } from './util';
3435
import { BWGRPCTransport } from './gRPC-transport';
3536
import {
@@ -138,6 +139,7 @@ class WalletApi extends EventEmitter implements IWalletApi {
138139
...input,
139140
accountAddress: AccountAddress.toBase58(input.accountAddress),
140141
payload: stringify(input.payload),
142+
parameters: JSONBig.stringify(input.parameters),
141143
}
142144
);
143145

packages/browser-wallet/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- Inject script loading wasm module, unnecessarily.
1212
- Missing date for delegation/validation stake decrease/stop has been restored.
1313
- Changing restake preference is no longer blocked when below minimum stake threshold.
14+
- `SendTransaction` in wallet-api now supports `bigint` as part of smart contract parameters, fixing an issue with using large numbers.
1415

1516
## 1.3.0
1617

packages/browser-wallet/src/popup/pages/SendTransaction/SendTransaction.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { BackgroundSendTransactionPayload } from '@shared/utils/types';
2525
import { convertEnergyToMicroCcd, getEnergyCost } from '@shared/utils/energy-helpers';
2626
import { useBlockChainParameters } from '@popup/shared/BlockChainParametersProvider';
2727
import { getPublicAccountAmounts } from 'wallet-common-helpers';
28+
import * as JSONBig from 'json-bigint';
29+
import { SmartContractParameters } from '@concordium/browser-wallet-api-helpers';
2830

2931
interface Location {
3032
state: {
@@ -60,6 +62,13 @@ export default function SendTransaction({ onSubmit, onReject }: Props) {
6062
),
6163
[JSON.stringify(state.payload)]
6264
);
65+
const parameters = useMemo(
66+
() =>
67+
state.payload.parameters === undefined
68+
? undefined
69+
: (JSONBig.parse(state.payload.parameters) as SmartContractParameters),
70+
[state.payload.parameters]
71+
);
6372

6473
const cost = useMemo(() => {
6574
if (chainParameters) {
@@ -116,7 +125,7 @@ export default function SendTransaction({ onSubmit, onReject }: Props) {
116125
<TransactionReceipt
117126
transactionType={transactionType}
118127
payload={payload}
119-
parameters={state.payload.parameters}
128+
parameters={parameters}
120129
sender={accountAddress}
121130
cost={cost}
122131
className="m-10"

packages/browser-wallet/src/popup/shared/TransactionReceipt/DisplayParameters.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { SmartContractParameters } from '@concordium/browser-wallet-api-helpers';
4+
import * as JSONBig from 'json-bigint';
45

56
type Props = {
67
parameters?: SmartContractParameters;
@@ -16,7 +17,7 @@ export default function DisplayParameters({ parameters }: Props) {
1617
{hasParameters && (
1718
<>
1819
<h5 className="m-b-5">{t('parameter')}:</h5>
19-
<pre className="transaction-receipt__parameter">{JSON.stringify(parameters, null, 2)}</pre>
20+
<pre className="transaction-receipt__parameter">{JSONBig.stringify(parameters, null, 2)}</pre>
2021
</>
2122
)}
2223
{!hasParameters && <h5>{t('noParameter')}</h5>}

packages/browser-wallet/src/shared/utils/payload-helpers.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
import { Buffer } from 'buffer/';
1717
import { SmartContractParameters, SchemaType, SchemaWithContext } from '@concordium/browser-wallet-api-helpers';
1818
import { serializationTypes } from '@concordium/browser-wallet-api/src/constants';
19+
import * as JSONBig from 'json-bigint';
1920

2021
export type HeadlessTransaction =
2122
| { type: AccountTransactionType.Update; payload: UpdateContractPayload }
@@ -56,11 +57,15 @@ export function parse(input: string | undefined) {
5657
export function parsePayload(
5758
type: AccountTransactionType,
5859
stringifiedPayload: string,
59-
parameters?: SmartContractParameters,
60+
stringifiedParameters?: string,
6061
schema?: SchemaWithContext,
6162
schemaVersion: SchemaVersion = 0
6263
): HeadlessTransaction {
6364
const payload = parse(stringifiedPayload);
65+
const parameters =
66+
stringifiedParameters === undefined
67+
? undefined
68+
: (JSONBig.parse(stringifiedParameters) as SmartContractParameters);
6469

6570
switch (type) {
6671
case AccountTransactionType.Update: {

packages/browser-wallet/src/shared/utils/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable @typescript-eslint/ban-types */
2-
import { SchemaWithContext, SmartContractParameters } from '@concordium/browser-wallet-api-helpers';
2+
import { SchemaWithContext } from '@concordium/browser-wallet-api-helpers';
33
import type { SchemaVersion, AccountTransactionType } from '@concordium/web-sdk';
44
import { RefAttributes } from 'react';
55
/**
@@ -80,7 +80,8 @@ export type BackgroundSendTransactionPayload = {
8080
accountAddress: string;
8181
type: AccountTransactionType;
8282
payload: string;
83-
parameters?: SmartContractParameters;
83+
/** This is a stringified version of SmartContractParameters (Using JSONBig.stringify). */
84+
parameters?: string;
8485
schema?: SchemaWithContext;
8586
schemaVersion?: SchemaVersion;
8687
url: string;

yarn.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2187,8 +2187,10 @@ __metadata:
21872187
"@concordium/web-sdk": ^7.1.0
21882188
"@protobuf-ts/grpcweb-transport": ^2.8.2
21892189
"@protobuf-ts/runtime-rpc": ^2.8.2
2190+
"@types/json-bigint": ^1.0.2
21902191
buffer: ^6.0.3
21912192
jest: ^29.7.0
2193+
json-bigint: ^1.0.0
21922194
ts-jest: ^29.1.1
21932195
languageName: unknown
21942196
linkType: soft

0 commit comments

Comments
 (0)