(param)
| 109 | */ |
| 110 | export class AbiCoder { |
| 111 | #getCoder(param) { |
| 112 | if (param.isArray()) { |
| 113 | return new ArrayCoder(this.#getCoder(param.arrayChildren), param.arrayLength, param.name); |
| 114 | } |
| 115 | if (param.isTuple()) { |
| 116 | return new TupleCoder(param.components.map((c) => this.#getCoder(c)), param.name); |
| 117 | } |
| 118 | switch (param.baseType) { |
| 119 | case "address": |
| 120 | return new AddressCoder(param.name); |
| 121 | case "bool": |
| 122 | return new BooleanCoder(param.name); |
| 123 | case "string": |
| 124 | return new StringCoder(param.name); |
| 125 | case "bytes": |
| 126 | return new BytesCoder(param.name); |
| 127 | case "": |
| 128 | return new NullCoder(param.name); |
| 129 | } |
| 130 | // u?int[0-9]* |
| 131 | let match = param.type.match(paramTypeNumber); |
| 132 | if (match) { |
| 133 | let size = parseInt(match[2] || "256"); |
| 134 | assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, "invalid " + match[1] + " bit length", "param", param); |
| 135 | return new NumberCoder(size / 8, (match[1] === "int"), param.name); |
| 136 | } |
| 137 | // bytes[0-9]+ |
| 138 | match = param.type.match(paramTypeBytes); |
| 139 | if (match) { |
| 140 | let size = parseInt(match[1]); |
| 141 | assertArgument(size !== 0 && size <= 32, "invalid bytes length", "param", param); |
| 142 | return new FixedBytesCoder(size, param.name); |
| 143 | } |
| 144 | assertArgument(false, "invalid type", "type", param.type); |
| 145 | } |
| 146 | /** |
| 147 | * Get the default values for the given %%types%%. |
| 148 | * |
no test coverage detected