Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

external compile step erring for contract using AbiEncoderV2 #1774

Closed
1 task
BlinkyStitt opened this issue Feb 28, 2019 · 13 comments
Closed
1 task

external compile step erring for contract using AbiEncoderV2 #1774

BlinkyStitt opened this issue Feb 28, 2019 · 13 comments

Comments

@BlinkyStitt
Copy link

BlinkyStitt commented Feb 28, 2019


Issue

truffle-contract-schema errs when validating a contract artifact created by truffle when the contract uses AbiEncoderV2.

Steps to Reproduce

https://github.com/WyseNynja/truffle-ABIEncoderV2-error-repro

Expected Behavior

The artifact should validate.

Actual Results

Error: Schema validation failed. Errors:

should NOT have additional properties (additionalProperties):
{ dataPath: '.abi[0]',
  schemaPath: '#/additionalProperties',
  params: { additionalProperty: 'constant' },
  data:
   { constant: true,
     inputs: [ { name: 'bar', type: 'bytes[]' } ],
     name: 'foo',
     outputs: [],
     payable: false,
     stateMutability: 'pure',
     type: 'function' },
  parentSchema:
   { type: 'object',
     properties:
      { type: { type: 'string', enum: [ 'event' ] },
        name: { '$ref': '#/definitions/Name' },
        inputs:
         { type: 'array',
           items: { '$ref': '#/definitions/EventParameter' } },
        anonymous: { type: 'boolean' } },
     required: [ 'type', 'name', 'inputs', 'anonymous' ],
     additionalProperties: false } }

should NOT have additional properties (additionalProperties):
{ dataPath: '.abi[0]',
  schemaPath: '#/additionalProperties',
  params: { additionalProperty: 'name' },
  data:
   { constant: true,
     inputs: [ { name: 'bar', type: 'bytes[]' } ],
     name: 'foo',
     outputs: [],
     payable: false,
     stateMutability: 'pure',
     type: 'function' },
  parentSchema:
   { type: 'object',
     properties:
      { type: { type: 'string', enum: [ 'constructor' ] },
        inputs:
         { type: 'array', items: { '$ref': '#/definitions/Parameter' } },
        stateMutability: { '$ref': '#/definitions/StateMutability' },
        constant: { type: 'boolean' },
        payable: { type: 'boolean', default: false } },
     required: [ 'type', 'inputs', 'stateMutability' ],
     additionalProperties: false } }

should NOT have additional properties (additionalProperties):
{ dataPath: '.abi[0]',
  schemaPath: '#/additionalProperties',
  params: { additionalProperty: 'inputs' },
  data:
   { constant: true,
     inputs: [ { name: 'bar', type: 'bytes[]' } ],
     name: 'foo',
     outputs: [],
     payable: false,
     stateMutability: 'pure',
     type: 'function' },
  parentSchema:
   { type: 'object',
     properties:
      { type: { type: 'string', enum: [ 'fallback' ] },
        stateMutability: { '$ref': '#/definitions/StateMutability' },
        constant: { type: 'boolean' },
        payable: { type: 'boolean', default: false } },
     required: [ 'type', 'stateMutability' ],
     additionalProperties: false } }

should match pattern "^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?(\[[0-9]*\])?$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/0/pattern',
  params:
   { pattern:
      '^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?(\\[[0-9]*\\])?$' },
  data: 'bytes[]',
  parentSchema:
   { type: 'string',
     pattern:
      '^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?(\\[[0-9]*\\])?$' } }

should match pattern "^address(\[[0-9]*\])?$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/1/pattern',
  params: { pattern: '^address(\\[[0-9]*\\])?$' },
  data: 'bytes[]',
  parentSchema: { type: 'string', pattern: '^address(\\[[0-9]*\\])?$' } }

should match pattern "^bool(\[[0-9]*\])?$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/2/pattern',
  params: { pattern: '^bool(\\[[0-9]*\\])?$' },
  data: 'bytes[]',
  parentSchema: { type: 'string', pattern: '^bool(\\[[0-9]*\\])?$' } }

should match pattern "^u?fixed(0x8|8x0|0x16|8x8|16x0|0x24|8x16|16x8|24x0|0x32|8x24|16x16|24x8|32x0|0x40|8x32|16x24|24x16|32x8|40x0|0x48|8x40|16x32|24x24|32x16|40x8|48x0|0x56|8x48|16x40|24x32|32x24|40x16|48x8|56x0|0x64|8x56|16x48|24x40|32x32|40x24|48x16|56x8|64x0|0x72|8x64|16x56|24x48|32x40|40x32|48x24|56x16|64x8|72x0|0x80|8x72|16x64|24x56|32x48|40x40|48x32|56x24|64x16|72x8|80x0|0x88|8x80|16x72|24x64|32x56|40x48|48x40|56x32|64x24|72x16|80x8|88x0|0x96|8x88|16x80|24x72|32x64|40x56|48x48|56x40|64x32|72x24|80x16|88x8|96x0|0x104|8x96|16x88|24x80|32x72|40x64|48x56|56x48|64x40|72x32|80x24|88x16|96x8|104x0|0x112|8x104|16x96|24x88|32x80|40x72|48x64|56x56|64x48|72x40|80x32|88x24|96x16|104x8|112x0|0x120|8x112|16x104|24x96|32x88|40x80|48x72|56x64|64x56|72x48|80x40|88x32|96x24|104x16|112x8|120x0|0x128|8x120|16x112|24x104|32x96|40x88|48x80|56x72|64x64|72x56|80x48|88x40|96x32|104x24|112x16|120x8|128x0|0x136|8x128|16x120|24x112|32x104|40x96|48x88|56x80|64x72|72x64|80x56|88x48|96x40|104x32|112x24|120x16|128x8|136x0|0x144|8x136|16x128|24x120|32x112|40x104|48x96|56x88|64x80|72x72|80x64|88x56|96x48|104x40|112x32|120x24|128x16|136x8|144x0|0x152|8x144|16x136|24x128|32x120|40x112|48x104|56x96|64x88|72x80|80x72|88x64|96x56|104x48|112x40|120x32|128x24|136x16|144x8|152x0|0x160|8x152|16x144|24x136|32x128|40x120|48x112|56x104|64x96|72x88|80x80|88x72|96x64|104x56|112x48|120x40|128x32|136x24|144x16|152x8|160x0|0x168|8x160|16x152|24x144|32x136|40x128|48x120|56x112|64x104|72x96|80x88|88x80|96x72|104x64|112x56|120x48|128x40|136x32|144x24|152x16|160x8|168x0|0x176|8x168|16x160|24x152|32x144|40x136|48x128|56x120|64x112|72x104|80x96|88x88|96x80|104x72|112x64|120x56|128x48|136x40|144x32|152x24|160x16|168x8|176x0|0x184|8x176|16x168|24x160|32x152|40x144|48x136|56x128|64x120|72x112|80x104|88x96|96x88|104x80|112x72|120x64|128x56|136x48|144x40|152x32|160x24|168x16|176x8|184x0|0x192|8x184|16x176|24x168|32x160|40x152|48x144|56x136|64x128|72x120|80x112|88x104|96x96|104x88|112x80|120x72|128x64|136x56|144x48|152x40|160x32|168x24|176x16|184x8|192x0|0x200|8x192|16x184|24x176|32x168|40x160|48x152|56x144|64x136|72x128|80x120|88x112|96x104|104x96|112x88|120x80|128x72|136x64|144x56|152x48|160x40|168x32|176x24|184x16|192x8|200x0|0x208|8x200|16x192|24x184|32x176|40x168|48x160|56x152|64x144|72x136|80x128|88x120|96x112|104x104|112x96|120x88|128x80|136x72|144x64|152x56|160x48|168x40|176x32|184x24|192x16|200x8|208x0|0x216|8x208|16x200|24x192|32x184|40x176|48x168|56x160|64x152|72x144|80x136|88x128|96x120|104x112|112x104|120x96|128x88|136x80|144x72|152x64|160x56|168x48|176x40|184x32|192x24|200x16|208x8|216x0|0x224|8x216|16x208|24x200|32x192|40x184|48x176|56x168|64x160|72x152|80x144|88x136|96x128|104x120|112x112|120x104|128x96|136x88|144x80|152x72|160x64|168x56|176x48|184x40|192x32|200x24|208x16|216x8|224x0|0x232|8x224|16x216|24x208|32x200|40x192|48x184|56x176|64x168|72x160|80x152|88x144|96x136|104x128|112x120|120x112|128x104|136x96|144x88|152x80|160x72|168x64|176x56|184x48|192x40|200x32|208x24|216x16|224x8|232x0|0x240|8x232|16x224|24x216|32x208|40x200|48x192|56x184|64x176|72x168|80x160|88x152|96x144|104x136|112x128|120x120|128x112|136x104|144x96|152x88|160x80|168x72|176x64|184x56|192x48|200x40|208x32|216x24|224x16|232x8|240x0|0x248|8x240|16x232|24x224|32x216|40x208|48x200|56x192|64x184|72x176|80x168|88x160|96x152|104x144|112x136|120x128|128x120|136x112|144x104|152x96|160x88|168x80|176x72|184x64|192x56|200x48|208x40|216x32|224x24|232x16|240x8|248x0|0x256|8x248|16x240|24x232|32x224|40x216|48x208|56x200|64x192|72x184|80x176|88x168|96x160|104x152|112x144|120x136|128x128|136x120|144x112|152x104|160x96|168x88|176x80|184x72|192x64|200x56|208x48|216x40|224x32|232x24|240x16|248x8|256x0)?(\[[0-9]*\])?$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/3/pattern',
  params:
   { pattern:
      '^u?fixed(0x8|8x0|0x16|8x8|16x0|0x24|8x16|16x8|24x0|0x32|8x24|16x16|24x8|32x0|0x40|8x32|16x24|24x16|32x8|40x0|0x48|8x40|16x32|24x24|32x16|40x8|48x0|0x56|8x48|16x40|24x32|32x24|40x16|48x8|56x0|0x64|8x56|16x48|24x40|32x32|40x24|48x16|56x8|64x0|0x72|8x64|16x56|24x48|32x40|40x32|48x24|56x16|64x8|72x0|0x80|8x72|16x64|24x56|32x48|40x40|48x32|56x24|64x16|72x8|80x0|0x88|8x80|16x72|24x64|32x56|40x48|48x40|56x32|64x24|72x16|80x8|88x0|0x96|8x88|16x80|24x72|32x64|40x56|48x48|56x40|64x32|72x24|80x16|88x8|96x0|0x104|8x96|16x88|24x80|32x72|40x64|48x56|56x48|64x40|72x32|80x24|88x16|96x8|104x0|0x112|8x104|16x96|24x88|32x80|40x72|48x64|56x56|64x48|72x40|80x32|88x24|96x16|104x8|112x0|0x120|8x112|16x104|24x96|32x88|40x80|48x72|56x64|64x56|72x48|80x40|88x32|96x24|104x16|112x8|120x0|0x128|8x120|16x112|24x104|32x96|40x88|48x80|56x72|64x64|72x56|80x48|88x40|96x32|104x24|112x16|120x8|128x0|0x136|8x128|16x120|24x112|32x104|40x96|48x88|56x80|64x72|72x64|80x56|88x48|96x40|104x32|112x24|120x16|128x8|136x0|0x144|8x136|16x128|24x120|32x112|40x104|48x96|56x88|64x80|72x72|80x64|88x56|96x48|104x40|112x32|120x24|128x16|136x8|144x0|0x152|8x144|16x136|24x128|32x120|40x112|48x104|56x96|64x88|72x80|80x72|88x64|96x56|104x48|112x40|120x32|128x24|136x16|144x8|152x0|0x160|8x152|16x144|24x136|32x128|40x120|48x112|56x104|64x96|72x88|80x80|88x72|96x64|104x56|112x48|120x40|128x32|136x24|144x16|152x8|160x0|0x168|8x160|16x152|24x144|32x136|40x128|48x120|56x112|64x104|72x96|80x88|88x80|96x72|104x64|112x56|120x48|128x40|136x32|144x24|152x16|160x8|168x0|0x176|8x168|16x160|24x152|32x144|40x136|48x128|56x120|64x112|72x104|80x96|88x88|96x80|104x72|112x64|120x56|128x48|136x40|144x32|152x24|160x16|168x8|176x0|0x184|8x176|16x168|24x160|32x152|40x144|48x136|56x128|64x120|72x112|80x104|88x96|96x88|104x80|112x72|120x64|128x56|136x48|144x40|152x32|160x24|168x16|176x8|184x0|0x192|8x184|16x176|24x168|32x160|40x152|48x144|56x136|64x128|72x120|80x112|88x104|96x96|104x88|112x80|120x72|128x64|136x56|144x48|152x40|160x32|168x24|176x16|184x8|192x0|0x200|8x192|16x184|24x176|32x168|40x160|48x152|56x144|64x136|72x128|80x120|88x112|96x104|104x96|112x88|120x80|128x72|136x64|144x56|152x48|160x40|168x32|176x24|184x16|192x8|200x0|0x208|8x200|16x192|24x184|32x176|40x168|48x160|56x152|64x144|72x136|80x128|88x120|96x112|104x104|112x96|120x88|128x80|136x72|144x64|152x56|160x48|168x40|176x32|184x24|192x16|200x8|208x0|0x216|8x208|16x200|24x192|32x184|40x176|48x168|56x160|64x152|72x144|80x136|88x128|96x120|104x112|112x104|120x96|128x88|136x80|144x72|152x64|160x56|168x48|176x40|184x32|192x24|200x16|208x8|216x0|0x224|8x216|16x208|24x200|32x192|40x184|48x176|56x168|64x160|72x152|80x144|88x136|96x128|104x120|112x112|120x104|128x96|136x88|144x80|152x72|160x64|168x56|176x48|184x40|192x32|200x24|208x16|216x8|224x0|0x232|8x224|16x216|24x208|32x200|40x192|48x184|56x176|64x168|72x160|80x152|88x144|96x136|104x128|112x120|120x112|128x104|136x96|144x88|152x80|160x72|168x64|176x56|184x48|192x40|200x32|208x24|216x16|224x8|232x0|0x240|8x232|16x224|24x216|32x208|40x200|48x192|56x184|64x176|72x168|80x160|88x152|96x144|104x136|112x128|120x120|128x112|136x104|144x96|152x88|160x80|168x72|176x64|184x56|192x48|200x40|208x32|216x24|224x16|232x8|240x0|0x248|8x240|16x232|24x224|32x216|40x208|48x200|56x192|64x184|72x176|80x168|88x160|96x152|104x144|112x136|120x128|128x120|136x112|144x104|152x96|160x88|168x80|176x72|184x64|192x56|200x48|208x40|216x32|224x24|232x16|240x8|248x0|0x256|8x248|16x240|24x232|32x224|40x216|48x208|56x200|64x192|72x184|80x176|88x168|96x160|104x152|112x144|120x136|128x128|136x120|144x112|152x104|160x96|168x88|176x80|184x72|192x64|200x56|208x48|216x40|224x32|232x24|240x16|248x8|256x0)?(\\[[0-9]*\\])?$' },
  data: 'bytes[]',
  parentSchema:
   { type: 'string',
     pattern:
      '^u?fixed(0x8|8x0|0x16|8x8|16x0|0x24|8x16|16x8|24x0|0x32|8x24|16x16|24x8|32x0|0x40|8x32|16x24|24x16|32x8|40x0|0x48|8x40|16x32|24x24|32x16|40x8|48x0|0x56|8x48|16x40|24x32|32x24|40x16|48x8|56x0|0x64|8x56|16x48|24x40|32x32|40x24|48x16|56x8|64x0|0x72|8x64|16x56|24x48|32x40|40x32|48x24|56x16|64x8|72x0|0x80|8x72|16x64|24x56|32x48|40x40|48x32|56x24|64x16|72x8|80x0|0x88|8x80|16x72|24x64|32x56|40x48|48x40|56x32|64x24|72x16|80x8|88x0|0x96|8x88|16x80|24x72|32x64|40x56|48x48|56x40|64x32|72x24|80x16|88x8|96x0|0x104|8x96|16x88|24x80|32x72|40x64|48x56|56x48|64x40|72x32|80x24|88x16|96x8|104x0|0x112|8x104|16x96|24x88|32x80|40x72|48x64|56x56|64x48|72x40|80x32|88x24|96x16|104x8|112x0|0x120|8x112|16x104|24x96|32x88|40x80|48x72|56x64|64x56|72x48|80x40|88x32|96x24|104x16|112x8|120x0|0x128|8x120|16x112|24x104|32x96|40x88|48x80|56x72|64x64|72x56|80x48|88x40|96x32|104x24|112x16|120x8|128x0|0x136|8x128|16x120|24x112|32x104|40x96|48x88|56x80|64x72|72x64|80x56|88x48|96x40|104x32|112x24|120x16|128x8|136x0|0x144|8x136|16x128|24x120|32x112|40x104|48x96|56x88|64x80|72x72|80x64|88x56|96x48|104x40|112x32|120x24|128x16|136x8|144x0|0x152|8x144|16x136|24x128|32x120|40x112|48x104|56x96|64x88|72x80|80x72|88x64|96x56|104x48|112x40|120x32|128x24|136x16|144x8|152x0|0x160|8x152|16x144|24x136|32x128|40x120|48x112|56x104|64x96|72x88|80x80|88x72|96x64|104x56|112x48|120x40|128x32|136x24|144x16|152x8|160x0|0x168|8x160|16x152|24x144|32x136|40x128|48x120|56x112|64x104|72x96|80x88|88x80|96x72|104x64|112x56|120x48|128x40|136x32|144x24|152x16|160x8|168x0|0x176|8x168|16x160|24x152|32x144|40x136|48x128|56x120|64x112|72x104|80x96|88x88|96x80|104x72|112x64|120x56|128x48|136x40|144x32|152x24|160x16|168x8|176x0|0x184|8x176|16x168|24x160|32x152|40x144|48x136|56x128|64x120|72x112|80x104|88x96|96x88|104x80|112x72|120x64|128x56|136x48|144x40|152x32|160x24|168x16|176x8|184x0|0x192|8x184|16x176|24x168|32x160|40x152|48x144|56x136|64x128|72x120|80x112|88x104|96x96|104x88|112x80|120x72|128x64|136x56|144x48|152x40|160x32|168x24|176x16|184x8|192x0|0x200|8x192|16x184|24x176|32x168|40x160|48x152|56x144|64x136|72x128|80x120|88x112|96x104|104x96|112x88|120x80|128x72|136x64|144x56|152x48|160x40|168x32|176x24|184x16|192x8|200x0|0x208|8x200|16x192|24x184|32x176|40x168|48x160|56x152|64x144|72x136|80x128|88x120|96x112|104x104|112x96|120x88|128x80|136x72|144x64|152x56|160x48|168x40|176x32|184x24|192x16|200x8|208x0|0x216|8x208|16x200|24x192|32x184|40x176|48x168|56x160|64x152|72x144|80x136|88x128|96x120|104x112|112x104|120x96|128x88|136x80|144x72|152x64|160x56|168x48|176x40|184x32|192x24|200x16|208x8|216x0|0x224|8x216|16x208|24x200|32x192|40x184|48x176|56x168|64x160|72x152|80x144|88x136|96x128|104x120|112x112|120x104|128x96|136x88|144x80|152x72|160x64|168x56|176x48|184x40|192x32|200x24|208x16|216x8|224x0|0x232|8x224|16x216|24x208|32x200|40x192|48x184|56x176|64x168|72x160|80x152|88x144|96x136|104x128|112x120|120x112|128x104|136x96|144x88|152x80|160x72|168x64|176x56|184x48|192x40|200x32|208x24|216x16|224x8|232x0|0x240|8x232|16x224|24x216|32x208|40x200|48x192|56x184|64x176|72x168|80x160|88x152|96x144|104x136|112x128|120x120|128x112|136x104|144x96|152x88|160x80|168x72|176x64|184x56|192x48|200x40|208x32|216x24|224x16|232x8|240x0|0x248|8x240|16x232|24x224|32x216|40x208|48x200|56x192|64x184|72x176|80x168|88x160|96x152|104x144|112x136|120x128|128x120|136x112|144x104|152x96|160x88|168x80|176x72|184x64|192x56|200x48|208x40|216x32|224x24|232x16|240x8|248x0|0x256|8x248|16x240|24x232|32x224|40x216|48x208|56x200|64x192|72x184|80x176|88x168|96x160|104x152|112x144|120x136|128x128|136x120|144x112|152x104|160x96|168x88|176x80|184x72|192x64|200x56|208x48|216x40|224x32|232x24|240x16|248x8|256x0)?(\\[[0-9]*\\])?$' } }

should match pattern "^bytes(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32)(\[[0-9]*\])?" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/4/pattern',
  params:
   { pattern:
      '^bytes(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32)(\\[[0-9]*\\])?' },
  data: 'bytes[]',
  parentSchema:
   { type: 'string',
     pattern:
      '^bytes(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32)(\\[[0-9]*\\])?' } }

should match pattern "^bytes$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/5/pattern',
  params: { pattern: '^bytes$' },
  data: 'bytes[]',
  parentSchema: { type: 'string', pattern: '^bytes$' } }

should match pattern "^function(\[[0-9]*\])?$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/6/pattern',
  params: { pattern: '^function(\\[[0-9]*\\])?$' },
  data: 'bytes[]',
  parentSchema: { type: 'string', pattern: '^function(\\[[0-9]*\\])?$' } }

should match pattern "^string$" (pattern):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf/7/pattern',
  params: { pattern: '^string$' },
  data: 'bytes[]',
  parentSchema: { type: 'string', pattern: '^string$' } }

should match exactly one schema in oneOf (oneOf):
{ dataPath: '.abi[0].inputs[0].type',
  schemaPath: '#/definitions/Type/oneOf',
  params: {},
  data: 'bytes[]',
  parentSchema:
   { oneOf:
      [ { type: 'string',
          pattern:
           '^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?(\\[[0-9]*\\])?$' },
        { type: 'string', pattern: '^address(\\[[0-9]*\\])?$' },
        { type: 'string', pattern: '^bool(\\[[0-9]*\\])?$' },
        { type: 'string',
          pattern:
           '^u?fixed(0x8|8x0|0x16|8x8|16x0|0x24|8x16|16x8|24x0|0x32|8x24|16x16|24x8|32x0|0x40|8x32|16x24|24x16|32x8|40x0|0x48|8x40|16x32|24x24|32x16|40x8|48x0|0x56|8x48|16x40|24x32|32x24|40x16|48x8|56x0|0x64|8x56|16x48|24x40|32x32|40x24|48x16|56x8|64x0|0x72|8x64|16x56|24x48|32x40|40x32|48x24|56x16|64x8|72x0|0x80|8x72|16x64|24x56|32x48|40x40|48x32|56x24|64x16|72x8|80x0|0x88|8x80|16x72|24x64|32x56|40x48|48x40|56x32|64x24|72x16|80x8|88x0|0x96|8x88|16x80|24x72|32x64|40x56|48x48|56x40|64x32|72x24|80x16|88x8|96x0|0x104|8x96|16x88|24x80|32x72|40x64|48x56|56x48|64x40|72x32|80x24|88x16|96x8|104x0|0x112|8x104|16x96|24x88|32x80|40x72|48x64|56x56|64x48|72x40|80x32|88x24|96x16|104x8|112x0|0x120|8x112|16x104|24x96|32x88|40x80|48x72|56x64|64x56|72x48|80x40|88x32|96x24|104x16|112x8|120x0|0x128|8x120|16x112|24x104|32x96|40x88|48x80|56x72|64x64|72x56|80x48|88x40|96x32|104x24|112x16|120x8|128x0|0x136|8x128|16x120|24x112|32x104|40x96|48x88|56x80|64x72|72x64|80x56|88x48|96x40|104x32|112x24|120x16|128x8|136x0|0x144|8x136|16x128|24x120|32x112|40x104|48x96|56x88|64x80|72x72|80x64|88x56|96x48|104x40|112x32|120x24|128x16|136x8|144x0|0x152|8x144|16x136|24x128|32x120|40x112|48x104|56x96|64x88|72x80|80x72|88x64|96x56|104x48|112x40|120x32|128x24|136x16|144x8|152x0|0x160|8x152|16x144|24x136|32x128|40x120|48x112|56x104|64x96|72x88|80x80|88x72|96x64|104x56|112x48|120x40|128x32|136x24|144x16|152x8|160x0|0x168|8x160|16x152|24x144|32x136|40x128|48x120|56x112|64x104|72x96|80x88|88x80|96x72|104x64|112x56|120x48|128x40|136x32|144x24|152x16|160x8|168x0|0x176|8x168|16x160|24x152|32x144|40x136|48x128|56x120|64x112|72x104|80x96|88x88|96x80|104x72|112x64|120x56|128x48|136x40|144x32|152x24|160x16|168x8|176x0|0x184|8x176|16x168|24x160|32x152|40x144|48x136|56x128|64x120|72x112|80x104|88x96|96x88|104x80|112x72|120x64|128x56|136x48|144x40|152x32|160x24|168x16|176x8|184x0|0x192|8x184|16x176|24x168|32x160|40x152|48x144|56x136|64x128|72x120|80x112|88x104|96x96|104x88|112x80|120x72|128x64|136x56|144x48|152x40|160x32|168x24|176x16|184x8|192x0|0x200|8x192|16x184|24x176|32x168|40x160|48x152|56x144|64x136|72x128|80x120|88x112|96x104|104x96|112x88|120x80|128x72|136x64|144x56|152x48|160x40|168x32|176x24|184x16|192x8|200x0|0x208|8x200|16x192|24x184|32x176|40x168|48x160|56x152|64x144|72x136|80x128|88x120|96x112|104x104|112x96|120x88|128x80|136x72|144x64|152x56|160x48|168x40|176x32|184x24|192x16|200x8|208x0|0x216|8x208|16x200|24x192|32x184|40x176|48x168|56x160|64x152|72x144|80x136|88x128|96x120|104x112|112x104|120x96|128x88|136x80|144x72|152x64|160x56|168x48|176x40|184x32|192x24|200x16|208x8|216x0|0x224|8x216|16x208|24x200|32x192|40x184|48x176|56x168|64x160|72x152|80x144|88x136|96x128|104x120|112x112|120x104|128x96|136x88|144x80|152x72|160x64|168x56|176x48|184x40|192x32|200x24|208x16|216x8|224x0|0x232|8x224|16x216|24x208|32x200|40x192|48x184|56x176|64x168|72x160|80x152|88x144|96x136|104x128|112x120|120x112|128x104|136x96|144x88|152x80|160x72|168x64|176x56|184x48|192x40|200x32|208x24|216x16|224x8|232x0|0x240|8x232|16x224|24x216|32x208|40x200|48x192|56x184|64x176|72x168|80x160|88x152|96x144|104x136|112x128|120x120|128x112|136x104|144x96|152x88|160x80|168x72|176x64|184x56|192x48|200x40|208x32|216x24|224x16|232x8|240x0|0x248|8x240|16x232|24x224|32x216|40x208|48x200|56x192|64x184|72x176|80x168|88x160|96x152|104x144|112x136|120x128|128x120|136x112|144x104|152x96|160x88|168x80|176x72|184x64|192x56|200x48|208x40|216x32|224x24|232x16|240x8|248x0|0x256|8x248|16x240|24x232|32x224|40x216|48x208|56x200|64x192|72x184|80x176|88x168|96x160|104x152|112x144|120x136|128x128|136x120|144x112|152x104|160x96|168x88|176x80|184x72|192x64|200x56|208x48|216x40|224x32|232x24|240x16|248x8|256x0)?(\\[[0-9]*\\])?$' },
        { type: 'string',
          pattern:
           '^bytes(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32)(\\[[0-9]*\\])?' },
        { type: 'string', pattern: '^bytes$' },
        { type: 'string', pattern: '^function(\\[[0-9]*\\])?$' },
        { type: 'string', pattern: '^string$' } ] } }

should match exactly one schema in oneOf (oneOf):
{ dataPath: '.abi[0]',
  schemaPath: '#/items/oneOf',
  params: {},
  data:
   { constant: true,
     inputs: [ { name: 'bar', type: 'bytes[]' } ],
     name: 'foo',
     outputs: [],
     payable: false,
     stateMutability: 'pure',
     type: 'function' },
  parentSchema:
   { oneOf:
      [ { '$ref': '#/definitions/Event' },
        { '$ref': '#/definitions/ConstructorFunction' },
        { '$ref': '#/definitions/FallbackFunction' },
        { '$ref': '#/definitions/NormalFunction' } ] } }

    at Object.validate (/Users/bwstitt/code/MetaCoin/node_modules/truffle/build/webpack:/packages/truffle-contract-schema/index.js:197:1)
    at processTargets (/Users/bwstitt/code/MetaCoin/node_modules/truffle/build/webpack:/packages/truffle-external-compile/index.js:154:1)
Truffle v5.0.5 (core: 5.0.5)
Node v10.15.2
@eggplantzzz
Copy link
Contributor

Hey @wysenynja I'm not sure you set up the external compile script correctly. In the config you have compilers.command = "true". In the config the command property needs to refer to the script that will execute your own compile process.
So for example, if you have a script that compiles your artifacts in a file named myScript.sh you would need to have

  compilers: {
    external: {
      command: "./myScript.sh"
      ....

@BlinkyStitt
Copy link
Author

BlinkyStitt commented Mar 6, 2019

That’s not really the problem here. Truffle compile generates the artifacts the first run. The second run, the external compile step sees them (notice the paths for the external artifact sources) and tries to parse them and gives the error.

I did this to show that isn’t my actual external compile script causing the issues with the artifacts. The artifacts come directly from “truffle compile”

I could split it up, but that isn’t really related to the bug here.

@eggplantzzz
Copy link
Contributor

eggplantzzz commented Mar 6, 2019

Yes but my point is that if you are using an improper setup in the config I'm not sure what we can expect Truffle to do (who knows how it will error). If you take out the improper compiler config lines, Truffle has no problem handling the artifacts correctly. This tells me that it absolutely has something to do with the provided config.

@eggplantzzz
Copy link
Contributor

Hmm, but actually you might be right. It does look like there might be something up with the compiled artifact. Even though it doesn't error without the config you had, truffle-contract-schema doesn't seem to be able to validate that artifact. I'll go ahead and look into that to try and see what is going on. Thanks @wysenynja.

@eggplantzzz
Copy link
Contributor

Ok so we found a bug with truffle-contract-schema. It turns out that the validator hasn't been updated to account for bytes[]. We will go ahead and make some changes for the next release. Thanks for reporting this @wysenynja !!

@BlinkyStitt
Copy link
Author

Thank you! I realize how the reproduction repo running twice was a bit of a strange thing to do. It just seemed simpler than having two separate projects.

This contract does use bytes[], so that makes sense.

@BlinkyStitt
Copy link
Author

I think this bug also means that truffle-contract-schema isn't being run after truffle generates artifacts. Shouldn't it do that? It seems like the very first run of truffle compile should have given this error.

@gnidan
Copy link
Contributor

gnidan commented Mar 6, 2019

I think this bug also means that truffle-contract-schema isn't being run after truffle generates artifacts. Shouldn't it do that? It seems like the very first run of truffle compile should have given this error.

We use the schema in all cases, it's just a question of whether or not we validate in all cases. I thought we were validating everywhere but I guess that's not the case [anymore?].

I kind of want to turn on the validation and let the bug reports come flying in. But I won't do that so brashly :)

@zac-williamson
Copy link

zac-williamson commented Mar 10, 2019

Hi there, I'm having a similar issue with truffle-external-compile, figured I'd chime in here since the issue is so similar.

When I attempt to compile contracts through a custom compiler, the artifact object I'm creating is failing truffle-contract-schema's schema validation, in a similar manner as @wysenynja . The culprit appears to be a two-dimensional static array. The abi is the following:

    "abi": [
        {
            "constant": true,
            "inputs": [
                {
                    "name": "",
                    "type": "uint256[2][2]"
                },
                {
                    "name": "",
                    "type": "uint256[2]"
                }
            ],
            "name": "ecBatchMul",
            "outputs": [
                {
                    "name": "",
                    "type": "uint256[3]"
                }
            ],
            "payable": false,
            "stateMutability": "pure",
            "type": "function"
        }
    ]

I can post more details about the error messages I'm getting, if that helps. They're almost identical to @wysenynja 's log. I don't think multidimensional static arrays are an experimental ABI encoding either - the solc compiler has supported this kind of interface since at least version 0.4.8. Additionally, if I attempt to compile a standard Solidity contract that has the same inteface, via truffle compile, no errors are thrown.

Are there any plans to support for 2-dimensional static-sized arrays into truffle-contract-schema? If not, is there a way of turning off the schema validator?

@gnidan
Copy link
Contributor

gnidan commented Mar 10, 2019

Are there any plans to support for 2-dimensional static-sized arrays into truffle-contract-schema? If not, is there a way of turning off the schema validator?

Ah I remember discussing the fix but looks like it didn't get into a PR. Just made a quick change that will support n-dimensional arrays of any type, static and dynamic. This is kind of a naïve fix, and doesn't account for structs.

I'll need to refresh my memory on the allowable types syntax with the new encoder, but it should be relatively straightforward to get those in too. (Anyone here good with a regex and got a spare moment? PRs appreciated :)

@gnidan
Copy link
Contributor

gnidan commented Mar 10, 2019

Quick follow-up (but then I have to stop procrastinating taxes): whoa structs are expressed as tuples!

      {
        "name": "t",
        "type": "tuple",
        "components": [
          {
            "name": "x",
            "type": "uint256"
          },
          {
            "name": "y",
            "type": "uint256"
          }
        ]
      },

So that's not even just string matching, then. Shouldn't be too hard to express this in JSON-Schema, but it does appear that it's more than a regex.

@BlinkyStitt
Copy link
Author

I think truffle 5.0.8 has the fix for this. Will test soon

@BlinkyStitt
Copy link
Author

> Artifacts written to /usr/src/app/build/contracts
> Compiled successfully using:
   - solc: 0.5.4+commit.9549d8ff.Emscripten.clang

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants