diff --git a/.idea/dictionaries/fuxing.xml b/.idea/dictionaries/fuxing.xml
index 2f121c534..a0f0645cd 100644
--- a/.idea/dictionaries/fuxing.xml
+++ b/.idea/dictionaries/fuxing.xml
@@ -111,6 +111,7 @@
getcollateraltoken
getfutureswapblock
getgov
+ getgovproposal
getinterest
getloanscheme
getloantoken
@@ -171,6 +172,8 @@
listburnhistory
listcollateraltokens
listcommunitybalances
+ listgovproposals
+ listgovproposalvotes
listgovs
listloanschemes
listloantokens
diff --git a/apps/package.json b/apps/package.json
index a7366308d..142ff3465 100644
--- a/apps/package.json
+++ b/apps/package.json
@@ -41,7 +41,7 @@
"cache-manager": "4.1.0",
"cbor": "8.1.0",
"class-transformer": "0.5.1",
- "class-validator": "0.13.2",
+ "class-validator": "0.14.0",
"cross-fetch": "3.1.5",
"graphology": "0.25.1",
"graphology-components": "1.5.4",
diff --git a/apps/playground-api/src/controllers/RpcController.ts b/apps/playground-api/src/controllers/RpcController.ts
index 1dfd4bb30..b215b204d 100644
--- a/apps/playground-api/src/controllers/RpcController.ts
+++ b/apps/playground-api/src/controllers/RpcController.ts
@@ -10,6 +10,8 @@ import {
ArgumentMetadata
} from '@nestjs/common'
import { ApiClient } from '@defichain/jellyfish-api-core'
+import { IsArray, IsOptional } from 'class-validator'
+import { Transform } from 'class-transformer'
/**
* MethodWhitelist is a whitelist validation pipe to check whether a plain old rpc can be
@@ -63,7 +65,10 @@ export class MethodBlacklist implements PipeTransform {
}
export class CallRequest {
- params?: any[]
+ @IsOptional()
+ @IsArray()
+ @Transform(({ value }) => value !== undefined ? value : [])
+ params!: any[]
}
@Controller('/v0/playground/rpc')
diff --git a/apps/whale-api/src/module.api/rpc.controller.spec.ts b/apps/whale-api/src/module.api/rpc.controller.spec.ts
index 0744288c9..6046f30e3 100644
--- a/apps/whale-api/src/module.api/rpc.controller.spec.ts
+++ b/apps/whale-api/src/module.api/rpc.controller.spec.ts
@@ -38,7 +38,7 @@ it('should getblockchaininfo via deprecated endpoint', async () => {
it('should getblockchaininfo via JSON RPC 1.0', async () => {
const result = await controller.post({
method: 'getblockchaininfo'
- })
+ } as any)
expect(result.result.chain).toStrictEqual('regtest')
})
diff --git a/apps/whale-api/src/module.api/rpc.controller.ts b/apps/whale-api/src/module.api/rpc.controller.ts
index f280b42cf..a5162bd1e 100644
--- a/apps/whale-api/src/module.api/rpc.controller.ts
+++ b/apps/whale-api/src/module.api/rpc.controller.ts
@@ -54,7 +54,10 @@ export class MethodWhitelist implements PipeTransform {
}
export class JSONRPCParams {
- params?: any[]
+ @IsOptional()
+ @IsArray()
+ @Transform(({ value }) => value !== undefined ? value : [])
+ params!: any[]
}
export class JSONRPC {
@@ -68,7 +71,7 @@ export class JSONRPC {
@IsOptional()
@IsArray()
@Transform(({ value }) => value !== undefined ? value : [])
- params?: any[]
+ params!: any[]
}
@Controller('/rpc')
@@ -79,7 +82,7 @@ export class RpcController {
@Post()
async post (@Body() rpc: JSONRPC): Promise {
try {
- const result = await this.client.call(rpc.method, rpc.params ?? [], 'lossless')
+ const result = await this.client.call(rpc.method, rpc.params, 'lossless')
return new ApiRpcResponse(result)
} catch (err: any) {
if (err instanceof RpcApiError || err.payload !== undefined) {
diff --git a/package-lock.json b/package-lock.json
index 0b7330b57..6ac50f77e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,7 +64,7 @@
"cache-manager": "4.1.0",
"cbor": "8.1.0",
"class-transformer": "0.5.1",
- "class-validator": "0.13.2",
+ "class-validator": "0.14.0",
"cross-fetch": "3.1.5",
"graphology": "0.25.1",
"graphology-components": "1.5.4",
@@ -7114,8 +7114,7 @@
"node_modules/@types/validator": {
"version": "13.7.11",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.11.tgz",
- "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg==",
- "dev": true
+ "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg=="
},
"node_modules/@types/wif": {
"version": "2.0.2",
@@ -9586,11 +9585,12 @@
"integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw=="
},
"node_modules/class-validator": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz",
- "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz",
+ "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==",
"dependencies": {
- "libphonenumber-js": "^1.9.43",
+ "@types/validator": "^13.7.10",
+ "libphonenumber-js": "^1.10.14",
"validator": "^13.7.0"
}
},
@@ -16494,8 +16494,9 @@
}
},
"node_modules/libphonenumber-js": {
- "version": "1.9.49",
- "license": "MIT"
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.18.tgz",
+ "integrity": "sha512-NS4ZEgNhwbcPz1gfSXCGFnQm0xEiyTSPRthIuWytDzOiEG9xnZ2FbLyfJC4tI2BMAAXpoWbNxHYH75pa3Dq9og=="
},
"node_modules/light-my-request": {
"version": "5.6.1",
@@ -27500,7 +27501,7 @@
"cache-manager": "4.1.0",
"cbor": "8.1.0",
"class-transformer": "0.5.1",
- "class-validator": "0.13.2",
+ "class-validator": "0.14.0",
"cross-fetch": "3.1.5",
"graphology": "0.25.1",
"graphology-components": "1.5.4",
@@ -31436,8 +31437,7 @@
"@types/validator": {
"version": "13.7.11",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.11.tgz",
- "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg==",
- "dev": true
+ "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg=="
},
"@types/wif": {
"version": "2.0.2",
@@ -33119,11 +33119,12 @@
"integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw=="
},
"class-validator": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz",
- "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz",
+ "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==",
"requires": {
- "libphonenumber-js": "^1.9.43",
+ "@types/validator": "^13.7.10",
+ "libphonenumber-js": "^1.10.14",
"validator": "^13.7.0"
}
},
@@ -35612,7 +35613,7 @@
"cache-manager": "4.1.0",
"cbor": "8.1.0",
"class-transformer": "0.5.1",
- "class-validator": "0.13.2",
+ "class-validator": "0.14.0",
"cross-fetch": "3.1.5",
"graphology": "0.25.1",
"graphology-components": "1.5.4",
@@ -39548,8 +39549,7 @@
"@types/validator": {
"version": "13.7.11",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.11.tgz",
- "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg==",
- "dev": true
+ "integrity": "sha512-WqTos+CnAKN64YwyBMhgUYhb5VsTNKwUY6AuzG5qu9/pFZJar/RJFMZBXwX7VS+uzYi+lIAr3WkvuWqEI9F2eg=="
},
"@types/wif": {
"version": "2.0.2",
@@ -41231,11 +41231,12 @@
"integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw=="
},
"class-validator": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz",
- "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz",
+ "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==",
"requires": {
- "libphonenumber-js": "^1.9.43",
+ "@types/validator": "^13.7.10",
+ "libphonenumber-js": "^1.10.14",
"validator": "^13.7.0"
}
},
@@ -45954,7 +45955,9 @@
}
},
"libphonenumber-js": {
- "version": "1.9.49"
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.18.tgz",
+ "integrity": "sha512-NS4ZEgNhwbcPz1gfSXCGFnQm0xEiyTSPRthIuWytDzOiEG9xnZ2FbLyfJC4tI2BMAAXpoWbNxHYH75pa3Dq9og=="
},
"light-my-request": {
"version": "5.6.1",
@@ -55947,7 +55950,9 @@
}
},
"libphonenumber-js": {
- "version": "1.9.49"
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.18.tgz",
+ "integrity": "sha512-NS4ZEgNhwbcPz1gfSXCGFnQm0xEiyTSPRthIuWytDzOiEG9xnZ2FbLyfJC4tI2BMAAXpoWbNxHYH75pa3Dq9og=="
},
"light-my-request": {
"version": "5.6.1",