@paimaexample/evm-contracts 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +7 -0
  2. package/deno.json +28 -0
  3. package/docs/templates/contract.hbs +144 -0
  4. package/docs/templates/helpers.js +61 -0
  5. package/docs/templates/page.hbs +7 -0
  6. package/docs/templates/properties.js +76 -0
  7. package/hardhat.config.ts +11 -0
  8. package/index.js +1 -0
  9. package/mod.ts +0 -0
  10. package/package.json +13 -0
  11. package/remappings.txt +1 -0
  12. package/src/companions/ERC165Contract.json +21 -0
  13. package/src/companions/ERC165Contract.ts +21 -0
  14. package/src/companions/ERC20Contract.json +222 -0
  15. package/src/companions/ERC20Contract.ts +222 -0
  16. package/src/companions/ERC6551RegistryContract.json +128 -0
  17. package/src/companions/ERC6551RegistryContract.ts +128 -0
  18. package/src/companions/ERC721Contract.json +248 -0
  19. package/src/companions/ERC721Contract.ts +222 -0
  20. package/src/companions/IERC1155Contract.json +295 -0
  21. package/src/companions/IERC1155Contract.ts +295 -0
  22. package/src/companions/OldERC6551RegistryContract.json +133 -0
  23. package/src/companions/OldERC6551RegistryContract.ts +133 -0
  24. package/src/companions/PaimaERC721Contract.json +787 -0
  25. package/src/companions/PaimaERC721Contract.ts +787 -0
  26. package/src/companions/PaimaL2Contract.json +134 -0
  27. package/src/companions/PaimaL2Contract.ts +134 -0
  28. package/src/companions/README.md +5 -0
  29. package/src/contracts/AnnotatedMintNft.sol +171 -0
  30. package/src/contracts/BaseState.sol +16 -0
  31. package/src/contracts/ERC1967.sol +43 -0
  32. package/src/contracts/Erc20NftSale.sol +186 -0
  33. package/src/contracts/GenericPayment.sol +60 -0
  34. package/src/contracts/NativeNftSale.sol +97 -0
  35. package/src/contracts/PaimaL2Contract.sol +54 -0
  36. package/src/contracts/Proxy/Erc20NftSaleProxy.sol +79 -0
  37. package/src/contracts/Proxy/GenericPaymentProxy.sol +64 -0
  38. package/src/contracts/Proxy/NativeNftSaleProxy.sol +72 -0
  39. package/src/contracts/Proxy/OrderbookDexProxy.sol +27 -0
  40. package/src/contracts/README.md +72 -0
  41. package/src/contracts/State.sol +25 -0
  42. package/src/contracts/dev/ERC721Dev.sol +13 -0
  43. package/src/contracts/dev/Erc20Dev.sol +13 -0
  44. package/src/contracts/dev/NativeNftSaleUpgradeDev.sol +9 -0
  45. package/src/contracts/dev/NftSaleUpgradeDev.sol +12 -0
  46. package/src/contracts/dev/NftTypeMapper.sol +38 -0
  47. package/src/contracts/dev/Token.sol +15 -0
  48. package/src/contracts/dev/UpgradeDev.sol +10 -0
  49. package/src/contracts/orderbook/IOrderbookDex.sol +215 -0
  50. package/src/contracts/orderbook/OrderbookDex.sol +435 -0
  51. package/src/contracts/token/IERC4906Agnostic.sol +17 -0
  52. package/src/contracts/token/IInverseAppProjected1155.sol +40 -0
  53. package/src/contracts/token/IInverseAppProjectedNft.sol +38 -0
  54. package/src/contracts/token/IInverseBaseProjected1155.sol +25 -0
  55. package/src/contracts/token/IInverseBaseProjectedNft.sol +29 -0
  56. package/src/contracts/token/IInverseProjected1155.sol +38 -0
  57. package/src/contracts/token/IInverseProjectedNft.sol +41 -0
  58. package/src/contracts/token/ITokenUri.sol +10 -0
  59. package/src/contracts/token/IUri.sol +13 -0
  60. package/src/contracts/token/InverseAppProjected1155.sol +218 -0
  61. package/src/contracts/token/InverseAppProjectedNft.sol +192 -0
  62. package/src/contracts/token/InverseBaseProjected1155.sol +170 -0
  63. package/src/contracts/token/InverseBaseProjectedNft.sol +158 -0
  64. package/src/plugin/common.ts +35 -0
  65. package/src/plugin/deployment.ts +161 -0
  66. package/src/plugin/mod.ts +6 -0
  67. package/src/plugin/paimaL2.ts +202 -0
  68. package/src/recommendedHardhat.ts +86 -0
  69. package/test/lib/StdInvariant.sol +96 -0
  70. package/test/lib/cheatcodes.sol +89 -0
  71. package/test/lib/console.sol +1884 -0
  72. package/test/lib/ctest.sol +678 -0
  73. package/test/src/InverseAppProjected1155.t.sol +207 -0
  74. package/test/src/InverseAppProjectedNft.t.sol +164 -0
  75. package/test/src/InverseBaseProjected1155.t.sol +171 -0
  76. package/test/src/InverseBaseProjectedNft.t.sol +141 -0
  77. package/test/src/OrderbookDex.t.sol +710 -0
  78. package/test/src/OrderbookDexInvariant.t.sol +426 -0
  79. package/test/src/PaimaL2ContractTest.sol +115 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # Paima EVM contracts
2
+
3
+ NPM package for EVM contracts for Paima Engine and related utilities.
4
+
5
+ See
6
+ [the Paima documentation](https://docs.paimastudios.com/home/libraries/evm-contracts/introduction)
7
+ for full documentation.
package/deno.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@paima/evm-contracts",
3
+ "version": "0.3.0",
4
+ "license": "MIT",
5
+ "exports": "./mod.ts",
6
+ "imports": {
7
+ "@wagmi/cli": "npm:@wagmi/cli@2.3.1",
8
+ "hardhat": "npm:hardhat@3.0.0-next.20",
9
+ "@nomicfoundation/hardhat-ignition": "npm:@nomicfoundation/hardhat-ignition@3.0.0-next.20",
10
+ "@nomicfoundation/hardhat-viem": "npm:@nomicfoundation/hardhat-viem@3.0.0-next.20"
11
+ },
12
+ "tasks": {
13
+ // deno doesn't support installing packages from Github (https://github.com/denoland/deno/issues/18478)
14
+ // we can't easily use file: dependency as that isn't supported either (https://github.com/denoland/deno/issues/18474)
15
+ // so instead we symlink to a local copy of the project
16
+ "link:forge": "bash -c 'if ! [ -L ../../../../node_modules/forge-std ]; then ln -s ../forge-std ../../../../node_modules/forge-std; fi'",
17
+ // TODO: update `hardhat docgen` to Hardhat v3
18
+ // note: this should be `deno run hardhat3 compile`, but Deno doesn't like that so we have to use the full name
19
+ "build:contracts": "forge build && deno run -A npm:hardhat@3.0.0-next.3 compile",
20
+ "build:publish": "deno run -A prepare.ts",
21
+ "prebuild": "rm -rf ./build",
22
+ "build": "deno task prebuild && deno task build:contracts && deno task build:publish",
23
+ "clean": "rm -rf ./artifacts && rm -rf ./cache && rm -rf ./build",
24
+ "test": "forge test",
25
+ // TODO: how to integrate Prettier plugin with deno and/or forge?
26
+ "prettier": "prettier --write '**/*.{sol,js,ts}' --ignore-path .gitignore"
27
+ }
28
+ }
@@ -0,0 +1,144 @@
1
+ <ContractHeader githubLink="https://github.com/PaimaStudios/paima-engine/tree/master/packages/contracts/evm-contracts/{{__item_context.file.absolutePath}}" anchor="{{~anchor~}}">
2
+ ### {{name}}
3
+ </ContractHeader>
4
+
5
+ ```solidity
6
+ import "@paima/evm-contracts/{{__item_context.file.absolutePath}}";
7
+ ```
8
+
9
+ {{{natspec.dev}}}
10
+
11
+ {{#if modifiers}}
12
+ <SolidityOutlineBlock
13
+ type="Modifiers"
14
+ lists={[
15
+ {
16
+ category: "",
17
+ lines: [
18
+ {{#each modifiers}}
19
+ {
20
+ text: "{{name}}({{names params}})",
21
+ anchor: "xref-{{anchor~}}"
22
+ },
23
+ {{/each}}
24
+ ]
25
+ }
26
+ ]}
27
+ >
28
+ </SolidityOutlineBlock>
29
+ {{/if}}
30
+
31
+ {{#if has-functions}}
32
+ <SolidityOutlineBlock
33
+ type="Functions"
34
+ lists={[
35
+ {{#each inherited-functions}}
36
+ {
37
+ category: "{{#unless @first}}{{contract.name}}{{/unless}}",
38
+ lines: [
39
+ {{#each functions}}
40
+ {
41
+ text: "{{name}}({{names params}})",
42
+ anchor: "xref-{{anchor~}}"
43
+ },
44
+ {{/each}}
45
+ ]
46
+ },
47
+ {{/each}}
48
+ ]}
49
+ >
50
+ </SolidityOutlineBlock>
51
+ {{/if}}
52
+
53
+ {{#if has-events}}
54
+ <SolidityOutlineBlock
55
+ type="Events"
56
+ lists={[
57
+ {{#each inheritance}}
58
+ {
59
+ category: "{{#unless @first}}{{name}}{{/unless}}",
60
+ lines: [
61
+ {{#each events}}
62
+ {
63
+ text: "{{name}}({{names params}})",
64
+ anchor: "xref-{{anchor~}}"
65
+ },
66
+ {{/each}}
67
+ ]
68
+ },
69
+ {{/each}}
70
+ ]}
71
+ >
72
+ </SolidityOutlineBlock>
73
+ {{/if}}
74
+
75
+ {{#if has-errors}}
76
+ <SolidityOutlineBlock
77
+ type="Errors"
78
+ lists={[
79
+ {{#each inheritance}}
80
+ {
81
+ category: "{{#unless @first}}{{name}}{{/unless}}",
82
+ lines: [
83
+ {{#each errors}}
84
+ {
85
+ text: "{{name}}({{names params}})",
86
+ anchor: "xref-{{anchor~}}"
87
+ },
88
+ {{/each}}
89
+ ]
90
+ },
91
+ {{/each}}
92
+ ]}
93
+ >
94
+ </SolidityOutlineBlock>
95
+ {{/if}}
96
+
97
+
98
+ {{#each modifiers}}
99
+ <SolidityDetailBlock
100
+ title="{{name}}"
101
+ params="({{typed-params params}})"
102
+ visibility="modifier"
103
+ anchor="xref-{{anchor}}"
104
+ >
105
+ {{{escapeChars natspec.dev}}}
106
+ </SolidityDetailBlock>
107
+
108
+ {{/each}}
109
+
110
+ {{#each functions}}
111
+ <SolidityDetailBlock
112
+ title="{{name}}"
113
+ params="({{typed-params params}}){{#if returns2}} → {{typed-params returns2}}{{/if}}"
114
+ visibility="{{visibility}}"
115
+ anchor="xref-{{anchor}}"
116
+ >
117
+ {{{escapeChars natspec.dev}}}
118
+ </SolidityDetailBlock>
119
+
120
+ {{/each}}
121
+
122
+ {{#each events}}
123
+ <SolidityDetailBlock
124
+ title="{{name}}"
125
+ params="({{typed-params params}})"
126
+ visibility="event"
127
+ anchor="xref-{{anchor}}"
128
+ >
129
+ {{{escapeChars natspec.dev}}}
130
+ </SolidityDetailBlock>
131
+
132
+ {{/each}}
133
+
134
+ {{#each errors}}
135
+ <SolidityDetailBlock
136
+ title="{{name}}"
137
+ params="({{typed-params params}})"
138
+ visibility="error"
139
+ anchor="xref-{{anchor}}"
140
+ >
141
+ {{{escapeChars natspec.dev}}}
142
+ </SolidityDetailBlock>
143
+
144
+ {{/each}}
@@ -0,0 +1,61 @@
1
+ const { version } = require("../../package.json");
2
+
3
+ module.exports["escapeChars"] = (input) => {
4
+ if (input == null) return "No description given";
5
+ // escape the curly braces (replace them with \{ )
6
+ // useful to escape cases like {IERC721Receiver-onERC721Received}
7
+ return input.replace(/\{([a-zA-Z0-9_-]+)\}/g, "\\{$1\\}");
8
+ };
9
+
10
+ module.exports["oz-version"] = () => version;
11
+
12
+ module.exports["readme-path"] = (opts) => {
13
+ return "contracts/" + opts.data.root.id.replace(/\.mdx?$/, "") + "/README.md";
14
+ };
15
+
16
+ module.exports.names = (params) => params?.map((p) => p.name).join(", ");
17
+
18
+ module.exports["typed-params"] = (params) => {
19
+ return params
20
+ ?.map((p) =>
21
+ `${p.type}${p.indexed ? " indexed" : ""}${p.name ? " " + p.name : ""}`
22
+ )
23
+ .join(", ");
24
+ };
25
+
26
+ const slug = (module.exports.slug = (str) => {
27
+ if (str === undefined) {
28
+ throw new Error("Missing argument");
29
+ }
30
+ return str.replace(/\W/g, "-");
31
+ });
32
+
33
+ const linksCache = new WeakMap();
34
+
35
+ function getAllLinks(items) {
36
+ if (linksCache.has(items)) {
37
+ return linksCache.get(items);
38
+ }
39
+ const res = {};
40
+ linksCache.set(items, res);
41
+ for (const item of items) {
42
+ res[`xref-${item.anchor}`] =
43
+ `xref:${item.__item_context.page}#${item.anchor}`;
44
+ res[slug(item.fullName)] =
45
+ `pass:normal[xref:${item.__item_context.page}#${item.anchor}[\`${item.fullName}\`]]`;
46
+ }
47
+ return res;
48
+ }
49
+
50
+ module.exports["with-prelude"] = (opts) => {
51
+ const contents = opts.fn();
52
+ // generate table of contents
53
+ // const links = getAllLinks(opts.data.site.items);
54
+ // const neededLinks = contents
55
+ // .match(/\[[-._a-z0-9]+\]/gi)
56
+ // .map(m => m.replace(/^\[(.+)\]$/, '$1'))
57
+ // .filter(k => k in links);
58
+ // const prelude = neededLinks.map(k => `- [${k}](#${k})`).join('\n');
59
+ return contents;
60
+ // return prelude + '\n' + contents;
61
+ };
@@ -0,0 +1,7 @@
1
+ import SolidityDetailBlock from '@site/src/components/SolidityDetailBlock';
2
+ import SolidityOutlineBlock from '@site/src/components/SolidityOutlineBlock';
3
+ import ContractHeader from '@site/src/components/ContractHeader';
4
+
5
+ {{#with-prelude}}
6
+ {{readme (readme-path)}}
7
+ {{/with-prelude}}
@@ -0,0 +1,76 @@
1
+ const { isNodeType, findAll } = require("solidity-ast/utils");
2
+ const { slug } = require("./helpers");
3
+
4
+ module.exports.anchor = function anchor({ item, contract }) {
5
+ let res = "";
6
+ if (contract) {
7
+ res += contract.name + "-";
8
+ }
9
+ res += item.name;
10
+ if ("parameters" in item) {
11
+ const signature = item.parameters.parameters
12
+ .map((v) => v.typeName.typeDescriptions.typeString)
13
+ .join(",");
14
+ res += slug("(" + signature + ")");
15
+ }
16
+ if (isNodeType("VariableDeclaration", item)) {
17
+ res += "-" + slug(item.typeName.typeDescriptions.typeString);
18
+ }
19
+ return res;
20
+ };
21
+
22
+ module.exports.inheritance = function ({ item, build }) {
23
+ if (!isNodeType("ContractDefinition", item)) {
24
+ throw new Error("used inherited-items on non-contract");
25
+ }
26
+
27
+ return item.linearizedBaseContracts
28
+ .map((id) => build.deref("ContractDefinition", id))
29
+ .filter((c, i) => c.name !== "Context" || i === 0);
30
+ };
31
+
32
+ module.exports["has-functions"] = function ({ item }) {
33
+ return item.inheritance.some((c) => c.functions.length > 0);
34
+ };
35
+
36
+ module.exports["has-events"] = function ({ item }) {
37
+ return item.inheritance.some((c) => c.events.length > 0);
38
+ };
39
+
40
+ module.exports["has-errors"] = function ({ item }) {
41
+ return item.inheritance.some((c) => c.errors.length > 0);
42
+ };
43
+
44
+ module.exports.functions = function ({ item }) {
45
+ return [
46
+ ...[...findAll("FunctionDefinition", item)].filter((f) =>
47
+ f.visibility !== "private"
48
+ ),
49
+ ...[...findAll("VariableDeclaration", item)].filter((f) =>
50
+ f.visibility === "public"
51
+ ),
52
+ ];
53
+ };
54
+
55
+ module.exports.returns2 = function ({ item }) {
56
+ if (isNodeType("VariableDeclaration", item)) {
57
+ return [{ type: item.typeDescriptions.typeString }];
58
+ } else {
59
+ return item.returns;
60
+ }
61
+ };
62
+
63
+ module.exports["inherited-functions"] = function ({ item }) {
64
+ const { inheritance } = item;
65
+ const baseFunctions = new Set(
66
+ inheritance.flatMap((c) =>
67
+ c.functions.flatMap((f) => f.baseFunctions ?? [])
68
+ ),
69
+ );
70
+ return inheritance.map((contract, i) => ({
71
+ contract,
72
+ functions: contract.functions.filter(
73
+ (f) => !baseFunctions.has(f.id) && (f.name !== "constructor" || i === 0),
74
+ ),
75
+ }));
76
+ };
@@ -0,0 +1,11 @@
1
+ import type { HardhatUserConfig } from "hardhat/config";
2
+
3
+ import { defaultHardhatConfig } from "./src/recommendedHardhat.ts";
4
+
5
+ const config: HardhatUserConfig = {
6
+ ...defaultHardhatConfig({
7
+ outDir: "./build",
8
+ }),
9
+ };
10
+
11
+ export default config;
package/index.js ADDED
@@ -0,0 +1 @@
1
+ // Empty entry point for the npm package.
package/mod.ts ADDED
File without changes
package/package.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "type": "module",
3
+ "dependencies": {
4
+ "@openzeppelin/contracts": "5.1.0",
5
+ "@openzeppelin/contracts-upgradeable": "^5.1.0"
6
+ },
7
+ "name": "@paimaexample/evm-contracts",
8
+ "version": "0.3.0",
9
+ "description": "Paima EVM default contracts.",
10
+ "main": "index.js",
11
+ "author": "Paima Studios",
12
+ "license": "MIT"
13
+ }
package/remappings.txt ADDED
@@ -0,0 +1 @@
1
+ @openzeppelin/=node_modules/@openzeppelin/
@@ -0,0 +1,21 @@
1
+ [
2
+ {
3
+ "inputs": [
4
+ {
5
+ "internalType": "bytes4",
6
+ "name": "interfaceId",
7
+ "type": "bytes4"
8
+ }
9
+ ],
10
+ "name": "supportsInterface",
11
+ "outputs": [
12
+ {
13
+ "internalType": "bool",
14
+ "name": "",
15
+ "type": "bool"
16
+ }
17
+ ],
18
+ "stateMutability": "view",
19
+ "type": "function"
20
+ }
21
+ ]
@@ -0,0 +1,21 @@
1
+ export default [
2
+ {
3
+ inputs: [
4
+ {
5
+ internalType: "bytes4",
6
+ name: "interfaceId",
7
+ type: "bytes4",
8
+ },
9
+ ],
10
+ name: "supportsInterface",
11
+ outputs: [
12
+ {
13
+ internalType: "bool",
14
+ name: "",
15
+ type: "bool",
16
+ },
17
+ ],
18
+ stateMutability: "view",
19
+ type: "function",
20
+ },
21
+ ] as const;
@@ -0,0 +1,222 @@
1
+ [
2
+ {
3
+ "constant": true,
4
+ "inputs": [],
5
+ "name": "name",
6
+ "outputs": [
7
+ {
8
+ "name": "",
9
+ "type": "string"
10
+ }
11
+ ],
12
+ "payable": false,
13
+ "stateMutability": "view",
14
+ "type": "function"
15
+ },
16
+ {
17
+ "constant": false,
18
+ "inputs": [
19
+ {
20
+ "name": "_spender",
21
+ "type": "address"
22
+ },
23
+ {
24
+ "name": "_value",
25
+ "type": "uint256"
26
+ }
27
+ ],
28
+ "name": "approve",
29
+ "outputs": [
30
+ {
31
+ "name": "",
32
+ "type": "bool"
33
+ }
34
+ ],
35
+ "payable": false,
36
+ "stateMutability": "nonpayable",
37
+ "type": "function"
38
+ },
39
+ {
40
+ "constant": true,
41
+ "inputs": [],
42
+ "name": "totalSupply",
43
+ "outputs": [
44
+ {
45
+ "name": "",
46
+ "type": "uint256"
47
+ }
48
+ ],
49
+ "payable": false,
50
+ "stateMutability": "view",
51
+ "type": "function"
52
+ },
53
+ {
54
+ "constant": false,
55
+ "inputs": [
56
+ {
57
+ "name": "_from",
58
+ "type": "address"
59
+ },
60
+ {
61
+ "name": "_to",
62
+ "type": "address"
63
+ },
64
+ {
65
+ "name": "_value",
66
+ "type": "uint256"
67
+ }
68
+ ],
69
+ "name": "transferFrom",
70
+ "outputs": [
71
+ {
72
+ "name": "",
73
+ "type": "bool"
74
+ }
75
+ ],
76
+ "payable": false,
77
+ "stateMutability": "nonpayable",
78
+ "type": "function"
79
+ },
80
+ {
81
+ "constant": true,
82
+ "inputs": [],
83
+ "name": "decimals",
84
+ "outputs": [
85
+ {
86
+ "name": "",
87
+ "type": "uint8"
88
+ }
89
+ ],
90
+ "payable": false,
91
+ "stateMutability": "view",
92
+ "type": "function"
93
+ },
94
+ {
95
+ "constant": true,
96
+ "inputs": [
97
+ {
98
+ "name": "_owner",
99
+ "type": "address"
100
+ }
101
+ ],
102
+ "name": "balanceOf",
103
+ "outputs": [
104
+ {
105
+ "name": "balance",
106
+ "type": "uint256"
107
+ }
108
+ ],
109
+ "payable": false,
110
+ "stateMutability": "view",
111
+ "type": "function"
112
+ },
113
+ {
114
+ "constant": true,
115
+ "inputs": [],
116
+ "name": "symbol",
117
+ "outputs": [
118
+ {
119
+ "name": "",
120
+ "type": "string"
121
+ }
122
+ ],
123
+ "payable": false,
124
+ "stateMutability": "view",
125
+ "type": "function"
126
+ },
127
+ {
128
+ "constant": false,
129
+ "inputs": [
130
+ {
131
+ "name": "_to",
132
+ "type": "address"
133
+ },
134
+ {
135
+ "name": "_value",
136
+ "type": "uint256"
137
+ }
138
+ ],
139
+ "name": "transfer",
140
+ "outputs": [
141
+ {
142
+ "name": "",
143
+ "type": "bool"
144
+ }
145
+ ],
146
+ "payable": false,
147
+ "stateMutability": "nonpayable",
148
+ "type": "function"
149
+ },
150
+ {
151
+ "constant": true,
152
+ "inputs": [
153
+ {
154
+ "name": "_owner",
155
+ "type": "address"
156
+ },
157
+ {
158
+ "name": "_spender",
159
+ "type": "address"
160
+ }
161
+ ],
162
+ "name": "allowance",
163
+ "outputs": [
164
+ {
165
+ "name": "",
166
+ "type": "uint256"
167
+ }
168
+ ],
169
+ "payable": false,
170
+ "stateMutability": "view",
171
+ "type": "function"
172
+ },
173
+ {
174
+ "payable": true,
175
+ "stateMutability": "payable",
176
+ "type": "fallback"
177
+ },
178
+ {
179
+ "anonymous": false,
180
+ "inputs": [
181
+ {
182
+ "indexed": true,
183
+ "name": "owner",
184
+ "type": "address"
185
+ },
186
+ {
187
+ "indexed": true,
188
+ "name": "spender",
189
+ "type": "address"
190
+ },
191
+ {
192
+ "indexed": false,
193
+ "name": "value",
194
+ "type": "uint256"
195
+ }
196
+ ],
197
+ "name": "Approval",
198
+ "type": "event"
199
+ },
200
+ {
201
+ "anonymous": false,
202
+ "inputs": [
203
+ {
204
+ "indexed": true,
205
+ "name": "from",
206
+ "type": "address"
207
+ },
208
+ {
209
+ "indexed": true,
210
+ "name": "to",
211
+ "type": "address"
212
+ },
213
+ {
214
+ "indexed": false,
215
+ "name": "value",
216
+ "type": "uint256"
217
+ }
218
+ ],
219
+ "name": "Transfer",
220
+ "type": "event"
221
+ }
222
+ ]