Skip to content

Commit

Permalink
Support overloaded functions (#69)
Browse files Browse the repository at this point in the history
  • Loading branch information
vanruch authored Jun 5, 2024
1 parent 9381d15 commit fdb3a4d
Show file tree
Hide file tree
Showing 111 changed files with 6,780 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@subsquid/squid-gen-evm",
"comment": "Fix problems with function overloading",
"type": "patch"
}
],
"packageName": "@subsquid/squid-gen-evm"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@subsquid/squid-gen-targets",
"comment": "Add comments for generated schema",
"type": "patch"
}
],
"packageName": "@subsquid/squid-gen-targets"
}
53 changes: 52 additions & 1 deletion common/config/rush/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions rush.json
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,11 @@
"projectFolder": "tests/gravatar-parquet",
"shouldPublish": false
},
{
"packageName": "worker-registration-test",
"projectFolder": "tests/worker-registration",
"shouldPublish": false
},
{
"packageName": "ink-erc20",
"projectFolder": "tests/ink-erc20",
Expand Down
3 changes: 3 additions & 0 deletions squid-gen-evm/src/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ export class CoreCodegen {
this.out.indentation(() => {
targetPrinter.printPreBatch()
this.out.block(`for (let block of ctx.blocks)`, () => {
this.out.line('// Use ctx.log for logging. Avoid using `console.log` in squids')
this.out.line(`ctx.log.info(\`Received block #\${block.header.height} with \${block.transactions.length} transactions\`)`)
this.out.line()
targetPrinter.printFragmentSave(block, [
`block.header.id`,
`block.header.height`,
Expand Down
12 changes: 6 additions & 6 deletions squid-gen-evm/src/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export class HandlersCodegen {
const fragment = this.options.contract.events[e]
const handlerName = toCamelCase(`handle_${e}_event`)
this.eventsOut.block(`export function ${handlerName}(ctx: DataHandlerContext<Store>, log: Log)`, () => {
this.eventsOut.line(`const e = events['${e}'].decode(log)`)
this.eventsOut.line(`const e = events['${fragment.abiName}'].decode(log)`)
targetPrinter.printFragmentSave(fragment, [
`log.id`,
`log.block.height`,
Expand All @@ -74,9 +74,9 @@ export class HandlersCodegen {
...fragment.params.slice(6).map((p) => {
if (p.type === `json`) {
this.useJSON()
return `toJSON(e.${p.originalName ?? p.name})`
return `toJSON(e.${p.abiName ?? p.name})`
} else {
return `e.${p.originalName ?? p.name}`
return `e.${p.abiName ?? p.name}`
}
}),
])
Expand All @@ -91,7 +91,7 @@ export class HandlersCodegen {
const fragment = this.options.contract.functions[f]
const handlerName = toCamelCase(`handle_${f}_function`)
this.functionsOut.block(`export function ${handlerName}(ctx: DataHandlerContext<Store>, transaction: Transaction)`, () => {
this.functionsOut.line(`const f = functions['${f}'].decode(transaction)`)
this.functionsOut.line(`const f = functions['${fragment.abiName}'].decode(transaction)`)
targetPrinter.printFragmentSave(fragment, [
`transaction.id`,
`transaction.block.height`,
Expand All @@ -104,9 +104,9 @@ export class HandlersCodegen {
...fragment.params.slice(8).map((p, i) => {
if (p.type === `json`) {
this.useJSON()
return `toJSON(f.${p.originalName ?? p.name})`
return `toJSON(f.${p.abiName ?? p.name})`
} else {
return `f.${p.originalName ?? p.name}`
return `f.${p.abiName ?? p.name}`
}
}),
])
Expand Down
23 changes: 17 additions & 6 deletions squid-gen-evm/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,14 @@ function validateContractNames(config: Config) {
}
}

function dedupName(name: string, names: string[]) {
if (!name.includes('(')) return name;
const [base, _] = name.split('(');
const overloads = names.filter((n) => n.startsWith(base));
const index = overloads.indexOf(name);
return `${base}_${index + 1}`;
}

function getEvents(specFile: SpecFile, contractName: string, names: string[] | true) {
let items = specFile.events || {}

Expand All @@ -140,12 +148,13 @@ function getEvents(specFile: SpecFile, contractName: string, names: string[] | t
for (const name of filteredNames) {
const event = items[name]
assert(event != null, `Event "${name}" doesn't exist for this contract`)

events[name] = {
name: `${contractName}_event_${name}`,
const dedupedName = dedupName(name, filteredNames)
events[dedupedName] = {
name: `${contractName}_event_${dedupedName}`,
abiName: name,
params: [...staticEvent.params, ...Object.entries(event.params).map(([name, param]: [string, Codec<any> & {indexed?: boolean}]) => ({
name: toEventParamName(name),
originalName: name,
abiName: name,
type: getType(param),
indexed: !!param.indexed,
nullable: false,
Expand All @@ -171,9 +180,11 @@ function getFunctions(specFile: SpecFile, contractName: string, names: string[]
logger.warn(`readonly function "${name}" skipped`)
continue
}
const dedupedName = dedupName(name, filteredNames)

functions[name] = {
name: `${contractName}_function_${name}`,
functions[dedupedName] = {
name: `${contractName}_function_${dedupedName}`,
abiName: name,
params: [...staticFunction.params, ...Object.entries(fun.args as Record<string, Codec<any>>).map(([name, param]) => ({
name: toFunctionParamName(name),
type: getType(param),
Expand Down
3 changes: 2 additions & 1 deletion squid-gen-evm/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export interface SpecFile {

export type EscapedFragment = {
name: string
params: (FragmentParam & { originalName?: string })[]
abiName: string
params: (FragmentParam & { abiName?: string })[]

}

Expand Down
23 changes: 15 additions & 8 deletions squid-gen-evm/src/mappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,16 @@ export class MappingCodegen {
})
}

private printEventHandle(e: string) {
this.out.block(`if (events['${e}'].is(log))`, () => {
this.out.line(`return eventHandlers.${toCamelCase(`handle_${e}_event`)}(ctx, log)`)
private propGetter(prop: string) {
if (prop.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {
return `.${prop}`
}
return `['${prop}']`
}

private printEventHandle(fragmentName: string, abiName: string) {
this.out.block(`if (events${this.propGetter(abiName)}.is(log))`, () => {
this.out.line(`return eventHandlers.${toCamelCase(`handle_${fragmentName}_event`)}(ctx, log)`)
})
}

Expand All @@ -85,7 +92,7 @@ export class MappingCodegen {
this.out.block(`export function parseEvent(ctx: DataHandlerContext<Store>, log: Log)`, () => {
this.out.block(`try`, () => {
for (const e in this.options.contract.events) {
this.printEventHandle(e)
this.printEventHandle(e, this.options.contract.events[e].abiName)
}
})
this.out.block(`catch (error)`, () => {
Expand All @@ -97,9 +104,9 @@ export class MappingCodegen {
})
}

private printFunctionHandle(f: string) {
this.out.block(`if (functions['${f}'].is(transaction))`, () => {
this.out.line(`return functionHandlers.${toCamelCase(`handle_${f}_function`)}(ctx, transaction)`)
private printFunctionHandle(fragmentName: string, abiName: string) {
this.out.block(`if (functions${this.propGetter(abiName)}.is(transaction))`, () => {
this.out.line(`return functionHandlers.${toCamelCase(`handle_${fragmentName}_function`)}(ctx, transaction)`)
})
}

Expand All @@ -110,7 +117,7 @@ export class MappingCodegen {
() => {
this.out.block(`try`, () => {
for (const f in this.options.contract.functions) {
this.printFunctionHandle(f)
this.printFunctionHandle(f, this.options.contract.functions[f].abiName)
}
})
this.out.block(`catch (error)`, () => {
Expand Down
4 changes: 2 additions & 2 deletions squid-gen-evm/src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ export class ProcessorCodegen {
this.out.line(`topic0: [`)
this.out.indentation(() => {
for (let e in contract.events) {
this.out.line(`${contract.name}Abi.events['${e}'].topic,`)
this.out.line(`${contract.name}Abi.events['${contract.events[e].abiName}'].topic,`)
}
})
this.out.line(`],`)
Expand Down Expand Up @@ -177,7 +177,7 @@ export class ProcessorCodegen {
this.out.line(`sighash: [`)
this.out.indentation(() => {
for (let f in contract.functions) {
this.out.line(`${contract.name}Abi.functions['${f}'].sighash,`)
this.out.line(`${contract.name}Abi.functions['${contract.functions[f].abiName}'].sighash,`)
}
})
this.out.line(`],`)
Expand Down
7 changes: 7 additions & 0 deletions squid-gen-targets/src/postgres/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ export class PostgresTarget implements DataTarget {

async generate() {
let schema = this.src.file('../schema.graphql')
schema.line(`"""`)
schema.line(`This is GraphQL schema file. It was generated automatically by the squid-gen tool.`)
schema.line(`Each type corresponds to an entity in the database, a GraphQL type and an event/function on the contract.`)
schema.line(`Feel free to change the schema to fit your needs, and run \`sqd codegen\` to regenerate the models.`)
schema.line(`See more here: https://docs.subsquid.io/sdk/reference/schema-file/`)
schema.line(`"""`)
schema.line()
for (let e of this.entityMap.values()) {
let indexedFields = e.fields.filter((f) => f.indexed).map((f) => `"${f.name}"`)
schema.block(`type ${e.name} @entity`, () => {
Expand Down
3 changes: 3 additions & 0 deletions tests/gravatar/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import {Block, Transaction} from './model'

processor.run(db, async (ctx) => {
for (let block of ctx.blocks) {
// Use ctx.log for logging. Avoid using `console.log` in squids
ctx.log.info(`Received block #${block.header.height} with ${block.transactions.length} transactions`)

EntityBuffer.add(
new Block({
id: block.header.id,
Expand Down
12 changes: 6 additions & 6 deletions tests/gravatar/src/mapping/gravatar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ const address = '0x2e645469f354bb4f5c8a05b3b30a929361cf77ec'

export function parseEvent(ctx: DataHandlerContext<Store>, log: Log) {
try {
if (events['NewGravatar'].is(log)) {
if (events.NewGravatar.is(log)) {
return eventHandlers.handleNewGravatarEvent(ctx, log)
}
if (events['UpdatedGravatar'].is(log)) {
if (events.UpdatedGravatar.is(log)) {
return eventHandlers.handleUpdatedGravatarEvent(ctx, log)
}
}
Expand All @@ -24,16 +24,16 @@ export function parseEvent(ctx: DataHandlerContext<Store>, log: Log) {

export function parseFunction(ctx: DataHandlerContext<Store>, transaction: Transaction) {
try {
if (functions['updateGravatarImage'].is(transaction)) {
if (functions.updateGravatarImage.is(transaction)) {
return functionHandlers.handleUpdateGravatarImageFunction(ctx, transaction)
}
if (functions['setMythicalGravatar'].is(transaction)) {
if (functions.setMythicalGravatar.is(transaction)) {
return functionHandlers.handleSetMythicalGravatarFunction(ctx, transaction)
}
if (functions['updateGravatarName'].is(transaction)) {
if (functions.updateGravatarName.is(transaction)) {
return functionHandlers.handleUpdateGravatarNameFunction(ctx, transaction)
}
if (functions['createGravatar'].is(transaction)) {
if (functions.createGravatar.is(transaction)) {
return functionHandlers.handleCreateGravatarFunction(ctx, transaction)
}
}
Expand Down
4 changes: 4 additions & 0 deletions tests/worker-registration/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/.git
/node_modules
/lib
/*Versions.json
5 changes: 5 additions & 0 deletions tests/worker-registration/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
DB_NAME=squid
DB_PASS=squid
DB_PORT=23798
PROCESSOR_PROMETHEUS_PORT=3000
GQL_PORT=4350
10 changes: 10 additions & 0 deletions tests/worker-registration/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/node_modules
/lib
/builds

/**Versions.json

# IDE files
/.idea

pnpm-lock.yaml
Loading

0 comments on commit fdb3a4d

Please sign in to comment.